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 が再生されないビデオ

また、他のアプリはフラッシュで作成され、Adobe Air のネイティブ アプリとしてパッケージ化されています。

4

6 に答える 6

1

あなたの問題は、アクションで をIntent.parseUri()返すことだと思います(http://developer.android.com/reference/android/content/Intent.html#parseUri%28java.lang.String,%20int%29を参照)。そして、あなたのコードから、Android が実際にアクティビティ B を開始する必要があることを認識していないことがわかります。はジェネリックなので、id は最も適切と思われることを行います。アクティビティ B がそのカテゴリに該当しない場合 (おそらく標準のビデオ視聴アプリではない場合)、起動されません。次のことをお勧めします。IntentACTION_VIEWACTION_VIEW

  1. アクティビティ B を起動する方法を調べます (例Intent i = new Intent.("com.packageB.ActivityB");、または同様の。開発者が教えてくれるはずです。
  2. i.setData()インテントのデータをファイルに設定するために使用します。
  3. 使用するstartActivity()

ステップ 2 では、アクティビティ B が Uri を渡す必要がある他の方法があるかもしれません。この情報は開発者からも入手できます。を使用startActivityすると、アプリ B が実行されているかどうかを確認する必要がなくなります。とにかくAndroidがすること。

于 2013-06-11T05:45:12.987 に答える
1

マニフェスト ファイル内でインテント リスナーを定義します。

詳細については、ドキュメントを参照してください。

基本的に、アプリ B (インテントで開始するアプリ) の AndroidManifest.xml に、次のようなセクションを追加します。

<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

する必要はありません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 に答える
0

自分から別の apk を開始することは可能だと思います。この回答を確認してください。問題は、彼らの uri を知らなければ、あなたが提案したことを実行するのが難しいということです。これで、開発者に適切な名前を尋ねるか、自分のリスクを調べることができます (合法性についてはわかりません)。

于 2013-06-11T07:33:10.640 に答える