Android - 打开外部应用程序,然后调用意图URI

时间:2013-06-01 08:05:09

标签: android android-intent

我有一个应用'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上打包为本机应用程序

6 个答案:

答案 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)

在清单文件中定义目标侦听器。

请参阅docs for details.

基本上,你要做的是在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不属于该类别(可能不是标准的视频观看应用程序),它将无法启动。我建议如下:

  1. 了解如何启动活动B(例如Intent i = new Intent.("com.packageB.ActivityB");或类似活动。开发者应该能够告诉您。
  2. 使用i.setData()设置您对文件的意图数据。
  3. 使用startActivity()
  4. 对于第2步,活动B可能还有其他方式需要Uri通过。您也可以从开发人员那里获取此信息。 使用startActivity可以检查App B是否正在运行。 Android无论如何都会做的事情。

答案 5 :(得分:0)

我认为可以从你自己的另一个apk开始,只需检查this回答。问题是,如果你不了解他们的uri,你很难做到你的建议。 现在您可以向开发人员询问正确的名称,或者查看您自己的风险(我不知道其合法性)。