0

ユーザーがmp4ファイル、日付、時刻を選択できるアプリケーションを作成しました。設定が完了すると、アプリはフォアグラウンド サービスを開始し、時間になると暗黙的なインテントを使用してメディア ファイルを再生します。

ユーザーがメディア ファイルを選択できるようにするためのコード:

private void openFile() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.setType("video/mp4");
    startActivityForResult(intent, GET_FILE);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
    if (requestCode == GET_FILE && resultCode == AppCompatActivity.RESULT_OK) {

        // The resultData contains a URI for the document or directory that the user selected.
        media_uri = resultData.getData();
        Log.e("Activity_Files", "Received Uri: " + media_uri.toString());
}

API 23 を実行している私の電話でサンプルを実行するには、取得した logcat から

03-29 21:06:21.529 14630-14630/com.basulabs.mahalaya E/Activity_Files: Received Uri: content://com.android.externalstorage.documents/document/6333-6461%3AVID-20170319-WA0003.mp4

これは、Uri が正常に受信されたことを示しています。

フォアグラウンド サービスから、メディア ファイルを再生します。

Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(media_uri, "video/*");
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    Log.e("Mahalaya Service", "Time up!");
    if (intent.resolveActivity(getPackageManager()) != null) {
        Log.e("Mahalaya Service", "Intent fired.");
        startActivity(intent);
     }
}

再びlogcatから、

03-29 21:07:00.038 14630-15146/com.basulabs.mahalaya E/Mahalaya Service: Time up!
03-29 21:07:00.048 14630-15146/com.basulabs.mahalaya E/Mahalaya Service: Intent fired.

携帯電話で、mp4 ファイルを再生できるアプリのリストが表示されます。通常は mp4 ファイルを再生できる組み込みのメディア プレーヤーを選択します。今、私はエラーが発生します。

ここに画像の説明を入力

ログキャットから、

03-29 21:07:05.088 15199-15199/? E/CloudUtil: checkCloudAgentExistence() - NameNotFoundException
03-29 21:07:05.088 15199-15199/? E/MoviePlayer: initIntentInfo : LaunchType unknown!!! reset player info
03-29 21:07:05.088 15199-15199/? E/VUtils: resetPlayerInfo Normal List
03-29 21:07:05.178 15199-15199/? E/MoviePlayer: onResume. Intent is not vaild to play a video. finish()

インテントが有効でない理由を誰か教えてもらえますか?

更新 1:

VLC for Androidを使用して、API 27を実行するエミュレーターで試しました。Logcat は別のエラーをスローします。

2020-03-30 00:17:07.420 23672-23689/? E/VLC/LibVLC/Util: WARNING: Can't find shared library
2020-03-30 00:17:10.791 23672-23691/? E/VLC/FileUtils: Permission is no longer valid

更新 2:

アプリで恐ろしい問題を発見しました。私のアプリの構造は次のとおりです。

Activity1 --> メディア Uri を取得し、Activity2 を開始します

Activity2 --> ユーザーが日付を選択し、Activity3 を開始

Activity3 --> ユーザーが時間を選択し、MyService を開始

MyService --> インテントを使用して正しいタイミングでメディアを再生するフォアグラウンド サービス

ここで、テストの結果、Activity1 が MyService を直接開始した場合 (日付と時刻をプログラムで設定した場合)、メディアを適切に再生できることがわかりました。

しかし、Activity1 が Activity2 を開始すると、MyService が直接開始されます (ここでも時間を設定します)。メディアは再生できません!!

MyService を呼び出すのと同じインテント フラグを使用して Activity2 を呼び出すことを思い出してください。

intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);

これは必然的に、このリンクで@CommonsWare によって示される問題です。同じインテント フラグでアクティビティを開始すると、パーミッションは有効のままになると考えました。しかし、そうではありません!

4

0 に答える 0