4

我有一个应用程序'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 not playingVideo

另一个应用程序也是用 Flash 编写的,并在 adobe air 上打包为原生应用程序

4

6 回答 6

7

我有一个应用程序“A”。我正在打开另一个应用程序“B”的视频播放器并使用这样的意图 URI 调用播放视频

不,你不是。您可以通过阅读代码来判断——该代码块中没有startActivity()调用。

现在必要的条件是该应用程序“B”在后台打开以使其正常工作。如果应用程序已关闭(被 Android 或手动杀死)或崩溃,则会引发错误。

然后显然应用程序 B 有一个错误。请联系 App B 的作者寻求帮助。

于 2013-06-05T10:28:27.793 回答
2

您可以轻松获取正在运行的应用程序列表。

ActivityManager manager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<RunningAppProcessInfo> processes = manager.getRunningAppProcesses();

您可以轻松启动应用程序。

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.package....");
startActivity(LaunchIntent);

但是,您不能将应用程序启动到后台,因此这可能无法解决您的问题。

于 2013-06-04T11:41:39.057 回答
1

你不需要open that app 'B' first。只需检查该应用程序是否正在运行:

// Get running processes
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runningProcesses = manager.getRunningAppProcesses();

所以现在你拥有了所有正在运行的进程runningProcesses。只需遍历这些值即可确定您的应用程序“B”是否正在运行。可以在此处找到此迭代的示例:

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
  }
}
于 2013-06-04T22:52:51.673 回答
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
    }
}
于 2013-06-05T06:01:51.283 回答
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()

对于第 2 步,可能还有其他方式 Activity B 需要传递的 Uri。您也可以从开发人员那里获得此信息。使用startActivity使您不必检查 App B 是否正在运行。Android无论如何都会做的事情。

于 2013-06-11T05:45:12.987 回答
0

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

于 2013-06-11T07:33:10.640 回答