Abra outro aplicativo por conta própria (intenção)


136

Sei como atualizar meus próprios programas e como abrir programas usando o Uri predefinido (para sms ou e-mail, por exemplo)

Preciso saber como posso criar um Intent para abrir o MyTracks ou qualquer outro aplicativo que eu não saiba quais intenções eles escutam.

Eu obtive essas informações do DDMS, mas não consegui transformar isso em um Intent que eu possa usar. Isso é obtido ao abrir o MyTracks manualmente.

Obrigado pela ajuda

05-06 11:22:24.945: INFO/ActivityManager(76): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks bnds=[243,338][317,417] }
05-06 11:22:25.005: INFO/ActivityManager(76): Start proc com.google.android.maps.mytracks for activity com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks: pid=1176 uid=10063 gids={3003, 1015}
05-06 11:22:26.995: INFO/ActivityManager(76): Displayed activity com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks: 1996 ms (total 1996 ms)

Respostas:


141

Em primeiro lugar, o conceito de "aplicativo" no Android é um pouco extenso.

Um aplicativo - tecnicamente um processo - pode ter várias atividades, serviços, provedores de conteúdo e / ou ouvintes de transmissão. Se pelo menos um deles estiver em execução, o aplicativo estará em funcionamento (o processo).

Então, o que você precisa identificar é como deseja "iniciar o aplicativo".

Ok ... aqui está o que você pode experimentar:

  1. Crie uma intenção com action=MAINecategory=LAUNCHER
  2. Obtenha o PackageManagercontexto atual usandocontext.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0)onde a intenção tem category=LAUNCHER, action=MAINou packageManager.resolveActivity(<intent>, 0)para obter a primeira atividade com o main / launcher
  4. Obtenha o que ActivityInfovocê está interessado
  5. No ActivityInfo, obtenha o packageNameename
  6. Finalmente, criar outra intenção com com category=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name)esetFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. Finalmente, context.startActivity(newIntent)

E se eu quisesse abrir três aplicativos separados?
precisa saber é

7
A resposta do wiki da comunidade abaixo é melhor, se você souber o nome do pacote stackoverflow.com/a/7596063/379115
Martin Belcher - AtWrk 10/10

Como você pode transmitir dados entre o aplicativo de chamada e o aplicativo iniciado? Encontrei 'Intent.putExtra ()', mas não sei como recuperar os dados extras no aplicativo iniciado.
Bram

onCreate=> Bundle extras = getIntent().getExtras()=> if(extras != null) { extras.getString("blah") }etc #
Gaurav Vaish

2
getPackageManager().getLaunchIntentForPackage()já faz tudo isso por você github.com/android/platform_frameworks_base/blob/master/core/…
jrub 6/15

231

Eu tenho trabalhado assim,

/** Open another app.
 * @param context current Context, like Activity, App, or Service
 * @param packageName the full package name of the app to open
 * @return true if likely successful, false if unsuccessful
 */
public static boolean openApp(Context context, String packageName) {
    PackageManager manager = context.getPackageManager();
    try {
        Intent i = manager.getLaunchIntentForPackage(packageName);
        if (i == null) {
            return false;
            //throw new ActivityNotFoundException();
        }
        i.addCategory(Intent.CATEGORY_LAUNCHER);
        context.startActivity(i);
        return true;
    } catch (ActivityNotFoundException e) {
        return false;
    }
}

Exemplo de uso:

openApp(this, "com.google.android.maps.mytracks");

Espero que ajude alguém.


5
porque getLaunchIntentForPackage ("nome do pacote de aplicativos") pode causar exceção.
XTR

Esta é uma ótima resposta, pegue a exceção e faça o que você precisa, notifique o usuário etc. #
IT-Dan

5
Para não ser um defensor, mas não há razão para alocar um novo Intent na primeira linha, desde que você use o resultado da getLaunchIntentForPackagechamada.
precisa

2
getLaunchIntentForPackage()já adiciona a categoria, consulte a fonte: github.com/android/platform_frameworks_base/blob/master/core/…
jrub 6/15

96
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.setComponent(ComponentName.unflattenFromString("com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks"));
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    startActivity(intent);

EDIT:

conforme sugerido nos comentários, adicione uma linha antes startActivity(intent);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

18
mas exige saber o nome da atividade
njzk2

Tentei isso e ocorreu um erro ao recomendar o uso do sinalizador FLAG_ACTIVITY_NEW_TASK. Adicionei esta linha antes do startActivity e funcionou: intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
David-hoze

1
@ njzk2 é fácil encontrar o nome do pacote para algo no Google Play; está ali no URL. Por exemplo: play.google.com/store/apps/…
Da-Jin

@iceybobby sim, é fácil encontrar o nome do pacote, mas como você encontra o nome da classe da atividade a ser iniciada?
phreakhead

@phreakhead Você está certo. Acho que usei a solução nesta resposta: stackoverflow.com/a/8944286/1224186 para que o nome da atividade não fosse necessário e, portanto, acho que isso torna minha resposta ao njzk2 inútil aqui.
Da-Jin

39

Se você já possui o nome do pacote que deseja ativar, pode usar o seguinte código, que é um pouco mais genérico:

PackageManager pm = context.getPackageManager();
Intent appStartIntent = pm.getLaunchIntentForPackage(appPackageName);
if (null != appStartIntent)
{
    context.startActivity(appStartIntent);
}

Descobri que funciona melhor nos casos em que a atividade principal não foi encontrada pelo método regular de iniciar a atividade PRINCIPAL.


Melhor resposta para mim :-) útil para mim. Graças
Jalpesh Khakhi

Isto é perfeito pra mim. Muito obrigado Muzikant:)
Alex

13

Este é o código da minha base de soluções na solução MasterGaurav:

private void  launchComponent(String packageName, String name){
    Intent launch_intent = new Intent("android.intent.action.MAIN");
    launch_intent.addCategory("android.intent.category.LAUNCHER");
    launch_intent.setComponent(new ComponentName(packageName, name));
    launch_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    activity.startActivity(launch_intent);
}

public void startApplication(String application_name){
    try{
        Intent intent = new Intent("android.intent.action.MAIN");
        intent.addCategory("android.intent.category.LAUNCHER");

        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        List<ResolveInfo> resolveinfo_list = activity.getPackageManager().queryIntentActivities(intent, 0);

        for(ResolveInfo info:resolveinfo_list){
            if(info.activityInfo.packageName.equalsIgnoreCase(application_name)){
                launchComponent(info.activityInfo.packageName, info.activityInfo.name);
                break;
            }
        }
    }
    catch (ActivityNotFoundException e) {
        Toast.makeText(activity.getApplicationContext(), "There was a problem loading the application: "+application_name,Toast.LENGTH_SHORT).show();
    }
}

10

Usando a solução inversus, ampliei o snippet com uma função, que será chamada quando o aplicativo desejado não estiver instalado no momento. Por isso, funciona como: Execute o aplicativo pelo nome do pacote. Se não for encontrado, abra o Android market - o Google play para este pacote .

public void startApplication(String packageName)
{
    try
    {
        Intent intent = new Intent("android.intent.action.MAIN");
        intent.addCategory("android.intent.category.LAUNCHER");

        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        List<ResolveInfo> resolveInfoList = getPackageManager().queryIntentActivities(intent, 0);

        for(ResolveInfo info : resolveInfoList)
            if(info.activityInfo.packageName.equalsIgnoreCase(packageName))
            {
                launchComponent(info.activityInfo.packageName, info.activityInfo.name);
                return;
            }

        // No match, so application is not installed
        showInMarket(packageName);
    }
    catch (Exception e) 
    {
        showInMarket(packageName);
    }
}

private void launchComponent(String packageName, String name)
{
    Intent intent = new Intent("android.intent.action.MAIN");
    intent.addCategory("android.intent.category.LAUNCHER");
    intent.setComponent(new ComponentName(packageName, name));
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    startActivity(intent);
}

private void showInMarket(String packageName)
{
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName));
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

E é usado assim:

startApplication("org.teepee.bazant");

6

Usa isto :

    PackageManager pm = getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage("com.package.name");
    startActivity(intent);

Tem alguma ideia? abra um test.apk em vez de instalado no armazenamento de dispositivos no aplicativo existente. dicas ao clicar em um botão para almoço test.apk apps que foram armazenados no projeto existente. obrigado antecipadamente.
Selim Raza

6

Abra o aplicativo, se existir, ou abra o aplicativo Play Store para instalá-lo:

private void open() {
    openApplication(getActivity(), "com.app.package.here");
}

public void openApplication(Context context, String packageN) {
    Intent i = context.getPackageManager().getLaunchIntentForPackage(packageN);
    if (i != null) {
        i.addCategory(Intent.CATEGORY_LAUNCHER);
        context.startActivity(i);
    } else {
        try {
            context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageN)));
        }
        catch (android.content.ActivityNotFoundException anfe) {
            context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + packageN)));
        }
    }
}

deve ser if (i! = null)
vallllll

4

Para iniciar outra atividade de aplicativo em meu aplicativo Activity. Está funcionando bem pra mim.

O código abaixo funcionará se o outro aplicativo já estiver instalado no seu telefone, caso contrário, não será possível redirecionar o formulário de um aplicativo para outro. Portanto, verifique se o aplicativo foi iniciado ou não

Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
startActivity(intent);

Por favor, não escreva várias respostas quase idênticas à mesma pergunta. Use o link "editar" abaixo da resposta e altere o original.
23615 AdrianHHH

3

// Isso funciona no Android Lollipop 5.0.2

public static boolean launchApp(Context context, String packageName) {

    final PackageManager manager = context.getPackageManager();
    final Intent appLauncherIntent = new Intent(Intent.ACTION_MAIN);
    appLauncherIntent.addCategory(Intent.CATEGORY_LAUNCHER);

    List<ResolveInfo> resolveInfos = manager.queryIntentActivities(appLauncherIntent, 0);
    if ((null != resolveInfos) && (!resolveInfos.isEmpty())) {
        for (ResolveInfo rInfo : resolveInfos) {
            String className = rInfo.activityInfo.name.trim();
            String targetPackageName = rInfo.activityInfo.packageName.trim();
            Log.d("AppsLauncher", "Class Name = " + className + " Target Package Name = " + targetPackageName + " Package Name = " + packageName);
            if (packageName.trim().equals(targetPackageName)) {
                Intent intent = new Intent();
                intent.setClassName(targetPackageName, className);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
                Log.d("AppsLauncher", "Launching Package '" + packageName + "' with Activity '" + className + "'");
                return true;
            }
        }
    }
    return false;
}

2

Como os aplicativos não têm permissão para alterar muitas configurações do telefone, você pode abrir uma atividade de configurações como qualquer outro aplicativo.

Observe a saída do LogCat depois de modificar a configuração manualmente:

INFO/ActivityManager(1306): Starting activity: Intent { act=android.intent.action.MAIN cmp=com.android.settings/.DevelopmentSettings } from pid 1924

Em seguida, use isso para exibir a página de configurações do seu aplicativo:

String SettingsPage = "com.android.settings/.DevelopmentSettings";

try
{
Intent intent = new Intent(Intent.ACTION_MAIN);             
intent.setComponent(ComponentName.unflattenFromString(SettingsPage));             
intent.addCategory(Intent.CATEGORY_LAUNCHER );             
startActivity(intent); 
}
catch (ActivityNotFoundException e)
{
 log it
}

2

Para o nível 3+ da API, nada mais que uma linha de código:

Intent intent = context.getPackageManager().getLaunchIntentForPackage("name.of.package");

Retornar uma intenção de inicialização do CATEGORY_INFO (aplicativos sem atividade do iniciador, papéis de parede, por exemplo, costumam usar isso para fornecer algumas informações sobre o aplicativo) e, se não o encontrar, retorna o pacote CATEGORY_LAUNCH, se existir.


2

Se você está tentando iniciar um SERVIÇO em vez de uma atividade, isso funcionou para mim:

Intent intent = new Intent();
intent.setClassName("com.example.otherapplication", "com.example.otherapplication.ServiceName");
context.startService(intent);

Se você usar o método intent.setComponent (...) conforme mencionado em outras respostas, poderá receber um aviso "Intenções implícitas com startService não são seguras".


2

Como alternativa, você também pode abrir a intenção do seu aplicativo no outro aplicativo com:

Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

onde uriestá o link direto para o outro aplicativo


2

Use o seguinte:

String packagename = "com.example.app";
startActivity(getPackageManager().getLaunchIntentForPackage(packagename));

2

Iniciar um aplicativo de outro aplicativo no Android

  Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
        startActivity(launchIntent);

2

Se você deseja abrir outro aplicativo e ele não estiver instalado, envie-o para a Google App Store para fazer o download

  1. Primeiro, crie o método openOtherApp, por exemplo

    public static boolean openOtherApp(Context context, String packageName) {
        PackageManager manager = context.getPackageManager();
         try {
            Intent intent = manager.getLaunchIntentForPackage(packageName);
            if (intent == null) {
                //the app is not installed
                try {
                    intent = new Intent(Intent.ACTION_VIEW);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent.setData(Uri.parse("market://details?id=" + packageName));
                    context.startActivity(intent);
                } catch (ActivityNotFoundException e) {
                    //throw new ActivityNotFoundException();
                    return false;
                }
    
             }
             intent.addCategory(Intent.CATEGORY_LAUNCHER);
             context.startActivity(intent);
             return true;
        } catch (ActivityNotFoundException e) {
            return false;
        }
    
    }

2.- Uso

openOtherApp(getApplicationContext(), "com.packageappname");

0

Experimente este código, espero que isso ajude você. Se este pacote estiver disponível, ele abrirá o aplicativo ou abrirá a loja de downloads.

    String  packageN = "aman4india.com.pincodedirectory";

            Intent i = getPackageManager().getLaunchIntentForPackage(packageN);
            if (i != null) {
                i.addCategory(Intent.CATEGORY_LAUNCHER);
                startActivity(i);
            } else {
                try {
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageN)));
                }
                catch (android.content.ActivityNotFoundException anfe) {
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + packageN)));
                }
            }


-3
Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setComponent(new ComponentName("package_name","package_name.class_name"));
        intent.putExtra("grace", "Hi");
        startActivity(intent);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.