Загрузить другое приложение из текущего приложения

Привет я разрабатываю приложение для Android, где я отображаю все установленные приложения в виде списка. При нажатии на элемент списка, я пытаюсь открыть это конкретное приложение.

Это код, который я пытаюсь

    mListView.setOnItemClickListener(new OnItemClickListener() 
    {
        private Intent intent;

        public void onItemClick(AdapterView<?> parent, View arg1, int position, long arg3) 
        {

                String packName = (String) listOfapps.get(position).get("packagename");

                intent = getPackageManager().getLaunchIntentForPackage(packName);

                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
                startActivity(intent);
        }
    });

Это отлично работает для некоторых приложений. Но по щелчку контактов и нескольких приложений, я получаю силу близко, как

android.content.ActivityNotFoundException: невозможно найти явный класс активности {com.android.contacts/com.android.internal.app.ResolverActivity}; Вы объявили об этой активности в вашем AndroidManifest.xml?

Не уверен, где я иду не так. Пожалуйста помоги. Спасибо

3 ответа

Решение

Возможно, что есть пакеты, которые не предоставляют модуль запуска Intent что вы можете использовать. Чтобы предотвратить сбой вашего приложения, вы должны быть в состоянии проверить, если ваш лаунчер Intent на самом деле будет работать так:

String packName = (String) listOfapps.get(position).get("packagename");
intent = getPackageManager().getLaunchIntentForPackage(packName);
// See how the package manager will resolve this Intent
ResolveInfo resolveInfo = getPackageManager().resolveActivity(intent,
            PackageManager.MATCH_DEFAULT_ONLY);
// Only start the activity if the package manager can resolve the Intent
if (resolveInfo != null) {
    startActivity(intent);
} else {
    // Tell the user he can't launch this app or whatever
}

Вам также не нужно устанавливать Intent.FLAG_ACTIVITY_NEW_TASK или же Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED на Intent потому что эти флаги уже должны быть установлены для вас при вызове getLaunchIntentForPackage(),

Попробуй вот так

PackageManager pm = getPackageManager();
try
{
    String packageName = "APP_PACKAGENAME";
    Intent launchIntent = pm.getLaunchIntentForPackage(packageName);
    startActivity(launchIntent);
}
catch (Exception e1)
{
}

Где имя пакета - это имя пакета другого приложения, которое вы хотите запустить

Для открытия контактов и некоторых внутренних приложений вам нужно назвать намерения. например для контактов. ты можешь попробовать это

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, PICK_CONTACT);

Вы можете дать условие if для mListView.setOnItemClickListener некоторым приложениям, которые являются внутренними.

Надеюсь это поможет.!!

Другие вопросы по тегам