Мое приложение получает силу закрытой, когда я пытаюсь запустить другое приложение [duplicate]

note для пользователей php 7, добавьте это в свой файл httpd.conf:

# PHP 7 specific configuration
<IfModule php7_module>
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
    <IfModule dir_module>
        DirectoryIndex index.html index.php
    </IfModule>
</IfModule>
126
задан Jonik 27 January 2015 в 17:18
поделиться

11 ответов

Попробуйте следующее:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Add respective layout
        setContentView(R.layout.main_activity);

        // Use package name which we want to check
        boolean isAppInstalled = appInstalledOrNot("com.check.application");  

        if(isAppInstalled) {
            //This intent will help you to launch if the package is already installed
            Intent LaunchIntent = getPackageManager()
                .getLaunchIntentForPackage("com.check.application");
            startActivity(LaunchIntent);

            Log.i("Application is already installed.");       
        } else {
            // Do whatever we want to do if application not installed
            // For example, Redirect to play store

            Log.i("Application is not currently installed.");
        }
    }

    private boolean appInstalledOrNot(String uri) {
        PackageManager pm = getPackageManager();
        try {
            pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
        }

        return false;
    }

}
276
ответ дан Harsh Patel 22 August 2018 в 00:32
поделиться
  • 1
    @Sathish: Надеюсь, это поможет вам – Aerrow 9 July 2012 в 10:57
  • 2
    Без сомнения, ваш пост действительно полезен, но я получаю исключение & quot; java.lang.RuntimeException: добавление окна не удалось & quot; и " E / AndroidRuntime (7554): вызвано: android.os.TransactionTooLargeException 05-14 11: 37: 25.305: E / AndroidRuntime (7554): at android.os.BinderProxy.transact (родной метод) 05-14 11:37: 25.305: E / AndroidRuntime (7554): на android.view.IWindowSession $ Stub $ Proxy.add (IWindowSession.java:516) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): на android.view.ViewRootImpl .setView (ViewRootImpl.java:494) & quot; – DJhon 14 May 2014 в 07:16
  • 3
    @BlueGreen: Привет, надеюсь, эта ссылка может вам помочь, stackoverflow.com/questions/11451393/… , иначе, если вы используете Dialog Class, попросите его проверить. :) – Aerrow 14 May 2014 в 07:19
  • 4
    @Aerrow .. Предположим, я проверяю мой .apk установлен или нет? во время установки ... Я получаю такое же исключение, проверяя мой пакет com.test.installedornot.My .apk размером более 9 МБ, тогда в этом случае, как я буду управлять этим исключением? – DJhon 14 May 2014 в 07:39
  • 5
    @BlueGreen: приведенный выше код проверяет только установленное приложение, в момент установки это не сработает. Для вашего случая используйте приемник Broadcast для получения уведомления после установки apk. – Aerrow 26 August 2014 в 05:54

Этот код не работал для меня. Работает следующий подход.

Создайте объект Intent с соответствующей информацией, а затем проверьте, является ли Intent вызываемым или нет, используя следующую функцию:

private boolean isCallable(Intent intent) {  
        List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,   
        PackageManager.MATCH_DEFAULT_ONLY);  
        return list.size() > 0;  
}
22
ответ дан Aditya 22 August 2018 в 00:32
поделиться
  • 1
    Это лучше, потому что не требуется использование исключений для управления потоком! – QED 29 August 2015 в 22:11
  • 2
    @QED это ужасает количество людей, использующих Исключения в качестве if заявлений! Это, безусловно, правильный ответ – ILikeTacos 7 September 2015 в 19:44
  • 3
    Каково содержание намерения? Строка с именем package не работает – Henrique de Sousa 18 November 2015 в 18:42
  • 4
    @HenriquedeSousa Intent intent = getPackageManager().getLaunchIntentForPackage("org.package.name"); – DMan 5 January 2016 в 22:41
  • 5
    Если приложение было отключено, оно должно быть неправильным. – Hugo 14 June 2016 в 14:58

Решение для очистки (без try-catch), чем принятый ответ (на основе AndroidRate Library ):

public static boolean isPackageExists(@NonNull final Context context, @NonNull final String targetPackage) {
    List<ApplicationInfo> packages = context.getPackageManager().getInstalledApplications(0);
    for (ApplicationInfo packageInfo : packages) {
        if (targetPackage.equals(packageInfo.packageName)) {
            return true;
        }
    }
    return false;
}
2
ответ дан Alexander Savin 22 August 2018 в 00:32
поделиться

Я думаю, что использование шаблона try / catch не очень хорошо для производительности. Я советую использовать это:

public static boolean appInstalledOrNot(Context context, String uri) {
    PackageManager pm = context.getPackageManager();
    List<PackageInfo> packageInfoList = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES);
    if (packageInfoList != null) {
        for (PackageInfo packageInfo : packageInfoList) {
            String packageName = packageInfo.packageName;
            if (packageName != null && packageName.equals(uri)) {
                return true;
            }
        }
    }
    return false;
}
2
ответ дан Egemen Hamutçu 22 August 2018 в 00:32
поделиться
  • 1
    Вышеупомянутый код в kotlin `` `private fun isAppInstalled (context: Context, uri: String): Boolean {val packageInfoList = context.packageManager.getInstalledPackages (PackageManager.GET_ACTIVITIES) возвращает packageInfoList.asSequence (). Filter {it? .PackageName = = uri} .any ()} `` ` – Kishan B 1 September 2017 в 12:42

Этот код проверяет, установлено ли приложение, но также проверяет, включено ли оно.

private boolean isAppInstalled(String packageName) {
    PackageManager pm = getPackageManager();
    try {
        pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
        return pm.getApplicationInfo(packageName, 0).enabled;
    }
    catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        return false;
    }
}
6
ответ дан Hitesh Sahu 22 August 2018 в 00:32
поделиться
  • 1
    что здесь ури? – Hitesh Sahu 10 July 2016 в 04:35
  • 2
    Это имя пакета приложения. Например, «com.example.apps.myapp». Я отредактировал свой ответ, чтобы показать packageName вместо uri. – youravgjoe 11 July 2016 в 14:30
  • 3
    Почувствуйте благодарность. – Hitesh Sahu 11 July 2016 в 14:37

Несколько более чистое решение, чем принятый ответ (на основе этот вопрос ):

public static boolean isAppInstalled(Context context, String packageName) {
    try {
        context.getPackageManager().getApplicationInfo(packageName, 0);
        return true;
    }
    catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

Я решил поместить его в вспомогательный класс как статическую утилиту. Пример использования:

boolean whatsappFound = AndroidUtils.isAppInstalled(context, "com.whatsapp");

В этом ответе показано, как получить приложение из Play Маркета, если приложение отсутствует, хотя следует проявлять осторожность на устройствах, которые не есть Play Store.

49
ответ дан Jonik 22 August 2018 в 00:32
поделиться

@ Egemen Hamutçu ответ в kotlin B -)

    private fun isAppInstalled(context: Context, uri: String): Boolean {
        val packageInfoList = context.packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES)
        return packageInfoList.asSequence().filter { it?.packageName == uri }.any()
    }
0
ответ дан Kishan B 22 August 2018 в 00:32
поделиться

Если вы знаете имя пакета, то это работает без использования блока try-catch или итерации через кучу пакетов:

public static boolean isPackageInstalled(Context context, String packageName) {
    final PackageManager packageManager = context.getPackageManager();
    Intent intent = packageManager.getLaunchIntentForPackage(packageName);
    if (intent == null) {
        return false;
    }
    List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    return !list.isEmpty();
}
12
ответ дан M. Prokhorov 22 August 2018 в 00:32
поделиться
  • 1
    return !list.isEmpty(); будет более дружественным к Java – headsvk 3 April 2017 в 14:37

Попробуйте это

Этот код используется для проверки погоды, в которой установлено ваше приложение с именем пакета, или нет, если нет, то он откроет ссылку playstore вашего приложения, иначе ваше установленное приложение

String your_apppackagename="com.app.testing";
    PackageManager packageManager = getPackageManager();
    ApplicationInfo applicationInfo = null;
    try {
        applicationInfo = packageManager.getApplicationInfo(your_apppackagename, 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    if (applicationInfo == null) {
        // not installed it will open your app directly on playstore
        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + your_apppackagename)));
    } else {
        // Installed
        Intent LaunchIntent = packageManager.getLaunchIntentForPackage(your_apppackagename);
        startActivity( LaunchIntent );
    }
1
ответ дан Sunil 22 August 2018 в 00:32
поделиться

Простейшая реализация с использованием Kotlin

fun PackageManager.isAppInstalled(packageName: String): Boolean =
        getInstalledApplications(PackageManager.GET_META_DATA)
                .firstOrNull { it.packageName == packageName } != null

И назовите это так (поиск приложения Spotify):

packageManager.isAppInstalled("com.spotify.music")
-1
ответ дан Víctor Albertos 22 August 2018 в 00:32
поделиться
0
ответ дан Aashish 4 November 2018 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: