Запуск приложения в другом приложении Android

Мой вопрос заключается в том, как запустить приложение A в приложении B, которое кажется, что приложение A находится в приложении B через глубокую ссылку?

На первом рисунке ниже приложение Debug отображается как отдельное приложение от Slack (новый код, глубокая ссылка Firebase). На втором изображении приложение Debug находится внутри приложения Slack (старый код, глубокая ссылка Android). Я хочу использовать прямые ссылки Firebase и показывать приложение Debug в других приложениях (Slack, Gmail и т. д.).

введите здесь описание изображениявведите здесь описание изображения

Может ли кто-нибудь просмотреть мой код ниже и сообщить мне, как я могу этого добиться?

Старый код, глубокая ссылка Android:

Манифест Android

<activity
    android:name=".activity.SplashScreenActivity"
    android:screenOrientation="portrait"
    android:theme="@style/SplashTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "abc://flights” -->
        <data
            android:host="sales"
            android:scheme="abc" />
        <data
            android:host="deals"
            android:scheme="abc" />
    </intent-filter>
</activity>

Активность:

Намерение намерение = новое намерение (SplashScreenActivity.this, BottomNavBarActivity.class);

        //Deep Linking Content
        Uri deepLinkData = getIntent().getData();
        if (deepLinkData != null) {
            intent.putExtra(EXTRA_DEEP_LINK, deepLinkData.getHost());
        }

        startActivity(intent);
        overridePendingTransition(R.anim.splash_fade_in, R.anim.splash_fade_out);
        finish();

Новый код, глубокая ссылка Firebase:

Манифест Android:

<activity
        android:name=".activity.SplashScreenActivity"
        android:screenOrientation="portrait"
        android:theme="@style/SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data
                android:host="abc.app.goo.gl"
                android:scheme="http"/>
            <data
                android:host="abc.app.goo.gl"
                android:scheme="https"/>
        </intent-filter>
    </activity>

Активность:

FirebaseDynamicLinks.getInstance()
            .getDynamicLink(getIntent())
            .addOnSuccessListener(this, new OnSuccessListener<PendingDynamicLinkData>() {
                @Override
                public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
                    // Get deep link from result (may be null if no link is found)
                    Uri deepLink = null;
                    if (pendingDynamicLinkData != null) {

                    // Start the activity through intent, same as before.

                    }
                }
            })
            .addOnFailureListener(this, new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.v(TAG, "Firebase deep link failure");
                }
            });

person Anky An    schedule 29.01.2018    source источник


Ответы (2)


Это зависит от приложения, которое отправляет намерение, например, проходят ли они FLAG_ACTIVITY_NEW_TASK или нет. Я подозреваю, что разница здесь в том, как Slack обрабатывает ссылки — они могут обрабатывать URL-адреса в Интернете иначе, чем в других форматах (ваши старые ссылки имеют нестандартные схемы).

person Ian Barber    schedule 29.01.2018
comment
Спасибо Ян. Я предполагаю, что Slack может обрабатывать URL-адреса в Интернете или другие форматы по-другому. Мне не удалось открыть другие форматы в приложениях, отличных от Slack. Не уверен, как другие приложения справятся с ними. - person Anky An; 30.01.2018

Создайте метод openApp() и вызовите его в соответствии с вашими потребностями.

public void openAnApp()
    {
      Boolean flag=false;
      try{
          Intent intent = new Intent(Intent.ACTION_SEND);
           intent.setType("text/plain");  
           final PackageManager packageManager = getActivity().getPackageManager();
           Intent intent1 = new Intent(Intent.ACTION_MAIN, null);
           intent1.addCategory(Intent.CATEGORY_LAUNCHER);
           List<ResolveInfo> resInfos = packageManager.queryIntentActivities(intent1, 0);
           ActivityInfo activity = null;
           //getting package names and adding them to the hashset
           for(ResolveInfo resolveInfo : resInfos) {
            System.out.println("apap="+resolveInfo.activityInfo.packageName);
            if(resolveInfo.activityInfo.packageName.equals("your.app.packagename"))
            {  
                flag = true;
                activity = resolveInfo.activityInfo; 
                break;
            }
         }
           if (flag) { 
           //  final ActivityInfo activity = app.activityInfo; 
               final ComponentName name = new ComponentName(activity.applicationInfo.packageName,activity.name);
               intent = new Intent(Intent.ACTION_MAIN);
               intent.addCategory(Intent.CATEGORY_LAUNCHER);
               intent.setComponent(name);
               getActivity().startActivity(intent);
               //startActivity(Intent.createChooser(intent , "Send image using.."));
              } else {
                  Uri uri=Uri.parse("market://details?id=your.app.packagename");
                Intent goToMarket=new Intent(Intent.ACTION_VIEW,uri);
                try{
                    startActivity(goToMarket);
                }catch(ActivityNotFoundException e){                    
                    Toast.makeText(getActivity(),"Couldn't launch the market",Toast.LENGTH_SHORT).show();
                }
              }
             } catch (Exception e) {
              Toast.makeText(getActivity(), "Something went wrong", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
    }
person Partha Chakraborty    schedule 30.01.2018
comment
Он запустил приложение, но не в родительском приложении. Кроме того, этот код предполагается использовать для диплинкинга, а не только для запуска приложения. Спасибо, в любом случае. - person Anky An; 31.01.2018