我有一个应用'A'。我正在打开另一个应用'B'的视频播放器并使用意图URI调用播放视频
String intentURI = "B://this/123";
try {
intent = Intent.parseUri(intentURI, Intent.URI_INTENT_SCHEME);
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
Logger.appendInfoLog("Something went wrong with B", TAG);
e.printStackTrace();
Logger.appendErrorLog(e.getMessage(), TAG);
finish();
}
startActivity(intent);
现在必要的条件是该应用'B'在背景中打开,以便工作。如果该应用关闭(由Android杀死或手动杀死) )或者它已经崩溃,这会引发错误。
有没有办法首先打开该应用'B'或检查其运行状态,然后进行意图URI调用。我不会从该应用程序获得控制权,一旦我转到另一个应用程序,我就没有任何控制权,直到用户按下后退按钮返回到我的应用程序。
更新
我想首先启动应用'B',然后以编程方式调用意图。这可能吗
更新
我跑过Catlog应用程序来检查应用程序B中出现了什么消息。它只显示文件123.file(我试图在应用程序B的视频播放器中播放的那个)未找到,但是当应用程序在后台运行时,它会很好。它还显示警告
java.lang.NullPointerException:PrintLn需要一条消息
然后它说
显示活动,但是mediaplayer.is没有播放视频
此外,其他应用程序是用flash编写的,并在adobe air上打包为本机应用程序
答案 0 :(得分:7)
我有一个应用'A'。我正在打开另一个应用'B'的视频播放器并使用意图URI调用播放视频
不,你不是。您可以通过阅读代码来判断 - 该代码块中没有startActivity()
调用。
现在必要的条件是该应用程序'B'在后台打开以使其工作。如果应用程序关闭(由Android杀死或手动杀死)或它已崩溃,则会引发错误。
然后显然应用B有一个错误。请联系应用B的作者寻求帮助。
答案 1 :(得分:2)
您可以轻松获取正在运行的应用列表。
ActivityManager manager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<RunningAppProcessInfo> processes = manager.getRunningAppProcesses();
您可以轻松启动应用程序。
Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.package....");
startActivity(LaunchIntent);
但是,您无法在后台启动应用,因此这可能无法解决您的问题。
答案 2 :(得分:1)
您不需要open that app 'B' first
。只需检查该应用是否正在运行:
// Get running processes
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runningProcesses = manager.getRunningAppProcesses();
现在,您已在runningProcesses
中拥有所有正在运行的进程。只需迭代这些值即可确定您的应用“B”是否正在运行。可以找到此迭代的示例here:
ActivityManager am = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE);
List l = am.getRunningAppProcesses();
Iterator i = l.iterator();
PackageManager pm = this.getPackageManager();
while(i.hasNext()) {
ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo)(i.next());
try {
CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA));
Log.w("LABEL", c.toString());
}catch(Exception e) {
//Name Not FOund Exception
}
}
答案 3 :(得分:1)
在清单文件中定义目标侦听器。
基本上,你要做的是在App B的AndroidManifest.xml中(你想要从Intent开始的应用程序),添加如下部分:
<receiver android:name=".MyIntentReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
然后在你的MyIntentReceiver
类中,你将定义处理意图的代码。
public class MyIntentReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
// handle intent here
}
}
答案 4 :(得分:1)
我认为您的问题是Intent.parseUri()
返回Intent
行为ACTION_VIEW
(请参阅http://developer.android.com/reference/android/content/Intent.html#parseUri%28java.lang.String,%20int%29)。从你的代码中,我发现android并没有意识到它实际上必须为此启动活动B. ACTION_VIEW
是通用的,所以id做了最合适的事情。如果活动B不属于该类别(可能不是标准的视频观看应用程序),它将无法启动。我建议如下:
Intent i = new Intent.("com.packageB.ActivityB");
或类似活动。开发者应该能够告诉您。i.setData()
设置您对文件的意图数据。 startActivity()
对于第2步,活动B可能还有其他方式需要Uri通过。您也可以从开发人员那里获取此信息。
使用startActivity
可以检查App B是否正在运行。 Android无论如何都会做的事情。
答案 5 :(得分:0)
我认为可以从你自己的另一个apk开始,只需检查this回答。问题是,如果你不了解他们的uri,你很难做到你的建议。 现在您可以向开发人员询问正确的名称,或者查看您自己的风险(我不知道其合法性)。