我设法像这样启动一个应用程序:
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 }
制定旨在针对特定活动的意图的正确方法是什么?
答案 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
无效。