Могу ли я создать ссылку, чтобы открыть приложение, которое не принадлежит мне? [Дубликат]

По вопросу «что мне делать с этим» может быть много ответов.

Более «формальный» способ предотвращения таких ошибок при разработке применяя дизайн по контракту в вашем коде. Это означает, что при разработке вы должны установить инварианты класса и / или даже предпосылки для функции и .

Короче говоря, инварианты класса гарантируют, что в вашем классе будут некоторые ограничения, которые не будут нарушены при нормальном использовании (и, следовательно, класс будет not получить в несогласованном состоянии). Предпосылки означают, что данные, данные как входные данные для функции / метода, должны соответствовать установленным ограничениям и никогда не нарушать их, а постулаты означают, что вывод функции / метода должен соответствовать установленным ограничениям снова не нарушая их. Условия контракта никогда не должны нарушаться во время выполнения программы без ошибок, поэтому дизайн по контракту проверяется на практике в режиме отладки, а отключен в выпусках , чтобы максимизировать развитую производительность системы.

Таким образом, вы можете избежать случаев NullReferenceException, которые являются результатом нарушения установленных ограничений. Например, если вы используете свойство объекта X в классе, а затем попытаетесь вызвать один из его методов, а X имеет нулевое значение, то это приведет к NullReferenceException:

public X { get; set; }

public void InvokeX()
{
    X.DoSomething(); // if X value is null, you will get a NullReferenceException
}

Но если вы установите «свойство X никогда не должно иметь нулевого значения» в качестве предпосылки для метода, вы можете предотвратить описанный ранее сценарий:

//Using code contracts:
[ContractInvariantMethod]
protected void ObjectInvariant () 
{
    Contract.Invariant ( X != null );
    //...
}

По этой причине Код Контракт существует для приложений .NET.

В качестве альтернативы дизайн по контракту может быть применен с использованием утверждений .

ОБНОВЛЕНИЕ: Стоит отметить, что этот термин был придуман Бертраном Майером в связи с его дизайном языка программирования Эйфеля .

128
задан Steve Haley 6 May 2010 в 11:47
поделиться

20 ответов

Во-первых, понятие «приложение» в Android немного расширено.

Приложение - технически процесс - может иметь несколько действий, сервисов, поставщиков контента и / или широковещательных слушателей. Если хотя бы один из них запущен, приложение работает и работает (процесс).

Итак, вам нужно определить, как вы хотите «запустить приложение».

Хорошо ... вот что вы можете попробовать:

  1. Создайте намерение с помощью action=MAIN и category=LAUNCHER
  2. Получите PackageManager от текущего контекст с использованием context.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0), где у цели есть category=LAUNCHER, action=MAIN или packageManager.resolveActivity(<intent>, 0), чтобы получить первое действие с помощью main / launcher
  4. Получить ActivityInfo вы интересуетесь
  5. Из ActivityInfo получите packageName и name
  6. . Наконец, создайте еще одно намерение с помощью category=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name) и setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. Наконец, context.startActivity(newIntent)
140
ответ дан iRavi iVooda 23 August 2018 в 19:09
поделиться

Я работаю так:

/** 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;
    }
}

Пример использования:

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

Надеюсь, что это кому-то поможет.

223
ответ дан 5 revs, 5 users 43% 23 August 2018 в 19:09
поделиться
  • 1
    потому что getLaunchIntentForPackage («имя пакета приложения») может вызвать исключение. – xtr 16 January 2012 в 05:49
  • 2
    Это отличный ответ, просто поймайте исключение и сделайте то, что вам нужно, уведомите пользователя и т. Д. – IT-Dan 29 November 2012 в 07:56
  • 3
    этот ответ работал как прелесть для меня! – e-nature 16 January 2013 в 15:31
  • 4
    Не быть приверженцем, но нет причин выделять новый Intent в первой строке, если вы используете результат вызова getLaunchIntentForPackage. – Chris Lacy 28 April 2013 в 12:12
  • 5
    getLaunchIntentForPackage() уже добавляет категорию, см. источник: github.com/android/platform_frameworks_base/blob/master/core/… – jrub 6 March 2015 в 12:40

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

    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)));
                }
            }
0
ответ дан AMAN SINGH 23 August 2018 в 19:09
поделиться

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

  Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
        startActivity(launchIntent);
2
ответ дан Ashutosh Srivastava 23 August 2018 в 19:09
поделиться

Если вы пытаетесь запустить SERVICE, а не активность, это сработало для меня:

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

Если вы используете метод intent.setComponent (...), как упоминается в других ответах, вы можете получить предупреждение «Неявные намерения с startService не безопасны».

2
ответ дан Dunc 23 August 2018 в 19:09
поделиться

В качестве альтернативы вы также можете открыть намерение своего приложения в другом приложении:

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

, где uri является отключением другого приложения

2
ответ дан electrobabe 23 August 2018 в 19:09
поделиться

Откройте приложение, если оно существует, или откройте приложение Play Store для его установки:

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)));
        }
    }
}
6
ответ дан Flinbor 23 August 2018 в 19:09
поделиться

// Это работает на 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;
}
3
ответ дан gsamaras 23 August 2018 в 19:09
поделиться

Это код моей базы решений на решении 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();
    }
}
13
ответ дан inversus 23 August 2018 в 19:09
поделиться

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

adb shell pm list packages -3 -f

Ссылка: http://www.aftvnews.com/how-to-determine-the -package-имя-ан-андроид-приложение /

0
ответ дан JDPMan 23 August 2018 в 19:09
поделиться
    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:

, как предложено в комментариях, добавить одну строку до startActivity(intent);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
95
ответ дан jox 23 August 2018 в 19:09
поделиться
  • 1
    но для этого требуется знать название деятельности – njzk2 18 October 2011 в 14:43
  • 2
    Я попробовал это и получил ошибку, рекомендую использовать флаг FLAG_ACTIVITY_NEW_TASK. Я добавил эту строку перед startActivity, и она сработала: intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK); – david-hoze 21 August 2013 в 11:08
  • 3
    @ njzk2 найти имя пакета для чего-то в Google Play легко; он находится прямо в URL-адресе. Например: play.google.com/store/apps/… – Da-Jin 5 February 2014 в 02:21
  • 4
    @iceybobby да имя пакета легко найти, но как вы находите имя класса для запуска? – phreakhead 18 June 2015 в 03:42
  • 5
    @phreakhead Ты прав. Я думаю, что я использовал решение в этом ответе: stackoverflow.com/a/8944286/1224186 , поэтому имя активности не было необходимо, и поэтому я думаю, что это делает мой ответ njzk2 бесполезным здесь. – Da-Jin 19 June 2015 в 00:52

Запустить другую активность приложения из моего приложения. Это работает для меня.

Ниже код будет работать, если другое приложение уже установлено в вашем телефоне, иначе невозможно перенаправить одно приложение в другое приложение. Убедитесь, что ваше приложение запущено или нет

Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
startActivity(intent);
4
ответ дан KCN 23 August 2018 в 19:09
поделиться
  • 1
    Пожалуйста, не пишите несколько ответов, которые почти идентичны одному и тому же вопросу. Используйте "edit & quot; ссылку ниже ответа и изменить оригинал. – AdrianHHH 23 November 2015 в 10:25

Если у вас уже есть имя пакета, которое вы хотите активировать, вы можете использовать следующий код, который является более общим:

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

Я обнаружил, что он работает лучше для случаев, когда основное действие не был найден обычным методом запуска MAIN-активности.

38
ответ дан Muzikant 23 August 2018 в 19:09
поделиться
  • 1
    Лучший ответ для меня :-) полезен для меня. благодаря – Jalpesh Khakhi 26 November 2016 в 12:43
  • 2
    Это идеально для меня. Большое спасибо Muzikant:) – Alex 23 December 2016 в 12:28

Используя решение от inversus, я расширил фрагмент с помощью функции, которая будет вызываться, когда требуемое приложение не будет установлено в данный момент. Так оно работает как: Запустить приложение по имени пакета. Если не найден, откройте Android-рынок - Google будет играть за этот пакет .

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);
}

И он используется следующим образом:

startApplication("org.teepee.bazant");
10
ответ дан peter.bartos 23 August 2018 в 19:09
поделиться

Для уровня API 3+ не более одной строки кода:

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

Возвращает запуск CATEGORY_INFO Intent (приложения без активности запуска, обои, например, часто используйте это, чтобы предоставить некоторую информацию о приложении), и, если его не найти, возвращает CATEGORY_LAUNCH пакета, если он существует.

2
ответ дан Renascienza 23 August 2018 в 19:09
поделиться
Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setComponent(new ComponentName("package_name","package_name.class_name"));
        intent.putExtra("grace", "Hi");
        startActivity(intent);
-3
ответ дан Sicco 23 August 2018 в 19:09
поделиться

Используйте это:

    PackageManager pm = getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage("com.package.name");
    startActivity(intent);
5
ответ дан Swetha 23 August 2018 в 19:09
поделиться
  • 1
    Есть идеи? откройте test.apk вместо установленного в хранилище устройств внутри существующего приложения. подсказки, когда нажимаете кнопку обеденного test.apk приложения, которые были сохранены в существующем проекте. заранее спасибо. – Selim Raza 27 July 2015 в 04:22

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

Посмотрите на результат LogCat после того, как вы действительно изменили настройку вручную:

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

Затем используйте это, чтобы отобразить страницу настроек из вашего приложения:

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
ответ дан TNR 23 August 2018 в 19:09
поделиться

Использовать следующее:

String packagename = "com.example.app";
startActivity(getPackageManager().getLaunchIntentForPackage(packagename));
2
ответ дан user6765242 23 August 2018 в 19:09
поделиться

Если вы хотите открыть другое приложение и оно не установлено, вы можете отправить его в Магазин приложений Google для загрузки

  1. Сначала создайте метод openOtherApp, например
    public static boolean openApp(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.- Использование

openOtherApp(getApplicationContext(), "com.packageappname");
1
ответ дан Vladimir Salguero 23 August 2018 в 19:09
поделиться
Другие вопросы по тегам:

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