web-dev-qa-db-ja.com

ディープリンクを使用して別のアプリケーションからアプリケーションを起動する

私は2つのアプリAとBに取り組んでいます。

アプリBには次のようなディープリンクがあります:myApp://open/myAction?param=123

次のようになります。

<!-- Update myAction deep link -->
<intent-filter Android:label="@string/launcherName">

    <action Android:name="Android.intent.action.VIEW" />

    <category Android:name="Android.intent.category.DEFAULT" />
    <category Android:name="Android.intent.category.BROWSABLE />
    <data
        Android:Host="open/*"
        Android:scheme="myApp" />
</intent-filter>

Adbを使用してアプリを起動すると、完全に機能します。

ユーザーがアクティビティAのボタンをクリックしたときに、アプリケーションBを起動しようとしています。

ボタンがクリックされたときにこれを試しました(次の場所にあります: GoodleDeveloper )(OnClickListener

// Build the intent
Uri myAction = Uri.parse(mEditText.getText().ToString()); // is something like: `myApp://open/myAction?param=1AD231XAs`
Intent mapIntent = new Intent(Intent.ACTION_VIEW, myAction);

// Verify it resolves
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;

// Start an activity if it's safe
if (isIntentSafe) {
    startActivity(mapIntent);
}

そして明らかに機能していませんが、なぜそれが機能していないのかわかりません。多分私は何かを逃した。

5
Shudy

ディープリンクを起動する前に、PackageManagerからインテントを作成し、アクション(ACTION_VIEW)とデータ(myAction)を設定してみてください。

    Uri myAction = Uri.parse(mEditText.getText().toString());

    PackageManager packageManager = getPackageManager();
    Intent intent = packageManager.getLaunchIntentForPackage(<app_destination_package>);

    if (intent != null) {
        intent.setAction(Intent.ACTION_VIEW);
        intent.setData(myAction);
        startActivity(intent);
    }
3
David M.

上記の回答が正解としてマークされた理由はわかりません。ディープリンクではなく、LAUNCHERとして定義された画面でのみアプリを開くことができるからです。

これに従って、アプリXXXから任意の画面を開くことができます!

 private void startAppXXXfromThisFuckinApp() {
   // pass the uri (scheme & screen path) of a screen defined from app XXX that you want to open (e.g HomeActivity)
   Uri uri = Uri.parse("xxx://screen/home");
   Intent mapIntent = new Intent(Intent.ACTION_VIEW, uri);

  //Verify if app XXX has this screen path
    PackageManager packageManager = getPackageManager();
    List<ResolveInfo> activities = 
    packageManager.queryIntentActivities(mapIntent, 0);
    boolean isIntentSafe = activities.size() > 0;

   //Start HomeActivity of app XXX because it's existed
    if (isIntentSafe) {
        startActivity(mapIntent);
    }
 }

そして明らかに、アプリXXXではAndroidManifest.xmlは次のようになっている必要があります。

<activity
 Android:name=".HomeActivity"
 <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="screen/home"
   Android:scheme="xxx" />
 </intent-filter>

ご列席の皆様、アプリXXXからHomeActivity画面が開きます。

3
lehongphucit

このようにマニフェストを変更します

<data
    Android:Host="open"
    Android:pathPattern="/myAction?param=123"
    Android:scheme=" myApp" />

最初のアクティビティでインテントを送信するには

Intent intent = new Intent (Intent.ActionView);
intent.setData (Uri.Parse (DEEP_LINK_URL));

そしてあなたの2番目の活動で

if(getIntent()!=null){
    Intent deepLink = getIntent();
    deepLink.getScheme();
    deepLink.getData().getPath();   
}
2
sharath kumar