如何启动第三方应用程序的意图?

时间:2018-12-10 18:24:26

标签: android android-intent

我设法像这样启动一个应用程序:

public void startNewActivity(String packageName) {
    Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(packageName);
    if (intent == null) {
        // Bring user to the market or let them choose an app?
        intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("market://details?id=" + packageName));
    }
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    mContext.startActivity(intent);
}

这样称呼:

this.startNewActivity("com.seleuco.mame4droid");

这可行,但是我想运行一个意图,不仅启动应用程序,而且直接运行游戏。

MAME4Droid的清单显示:

    <activity android:name="com.seleuco.mame4droid.MAME4droid" android:label="@string/app_name"
      android:configChanges="keyboardHidden|orientation|screenSize"
      android:launchMode="singleTask"
      android:windowSoftInputMode="stateAlwaysHidden" android:theme="@style/Theme.MAME4droid">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:host="" android:scheme="file" />
            <data android:mimeType="application/zip" />
        </intent-filter>
    </activity>

但是我不知道调用VIEW操作的正确方法。

我尝试过:(注释行是我尝试过的变体形式)

public void startMAME4DroidGame(String game) {
    Toast.makeText(mContext, game, Toast.LENGTH_SHORT).show();
    String packageName = "com.seleuco.mame4droid";
    try {
            //Intent intent = new Intent(packageName + "/com.seleuco.mame4droid.MAME4droid");
            Intent intent = new Intent("com.seleuco.mame4droid/android.intent.action.VIEW");
            //intent.setAction(Intent.ACTION_VIEW);
            //intent.setData(Uri.parse("file://" + game));
            intent.setData(Uri.parse("file:" +   // also tried with "file://" +
            "/sdcard/"+Environment.DIRECTORY_DOWNLOADS+"/"+game));
            mContext.startActivity(intent);
    } catch(Exception e) {
            Toast.makeText(mContext, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
}

结果:

    No activity found to handle Intent
    { act=com.seleuco.mame4droid.MAME4Droid/android.intent.action.VIEW 
    dat=file:///sdcard/Download/starforc.zip }

制定旨在针对特定活动的意图的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

如果您同时拥有这两个应用程序,则只需在第一个应用程序(例如mame4droid://)中添加网址架构(深链接),然后使用该应用程序处理所有内容。它使您可以使用简单的网址(例如 mame4droid:// openMyAct / file-uri 您必须在第一个应用程序的AndroidManifest中注册此架构,并处理要执行任何操作的意图。

另一种需要两个签名都由同一签名签名的方法是您要执行的操作,您确定两个APK都由同一签名签名吗?

此外,如果您只想打开这种文件,则必须注册一个扩展名(如您所做的那样),并执行类似的操作

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), fileMimeType);
startActivity(intent);

答案 1 :(得分:1)

具有操作VIEW的Intent,并且文件的URI作为数据来解决问题。我刚刚尝试过:

adb shell am start -a android.intent.action.VIEW -d file:///storage/emulated/0/MAME4droid/roms/myrom.zip -n com.seleuco.mame4droid/com.seleuco.mame4droid.MAME4droid

其中storage/emulated/0/MAME4droid/roms/myrom.zip是我的rom的文件。它将打开该应用程序,然后游戏开始。

它也可以在应用程序中工作:

final Intent intent = new Intent(Intent.ACTION_VIEW)
        .setData(Uri.parse("content:///storage/emulated/0/MAME4droid/roms/myrom.zip"))
        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        .setClassName("com.seleuco.mame4droid", "com.seleuco.mame4droid.MAME4droid");
context.startActivity(intent);

但是,在Android 24+上,我必须在清单中声明一个文件提供程序:

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"/>
</provider>

以及带有路径的xml:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="external_files" path="."/>
</paths>

不知道为什么,但是当我从应用程序启动Intent时,只有content方案有效,file无效。