19

ユーザーが外部ストレージまたは内部ストレージを使用できるようにしようとしています。画像とビデオの両方を表示しています (科学的な性質のもの)。メディアを SD カードに保存する場合は、すべて問題ありません。しかし、メディアを内部に保存すると、画像だけが表示されます。何を試しても、applicationcontext.getFilesDir() に保存されているメディアを読み込んで表示しようとすると、さまざまなエラーが発生します。

ビデオビューのコンテンツをそのようなファイルに設定するトリックはありますか?

ContentResolver は役に立ちますか?

関連して、外部ストレージが存在すると仮定するのは悪い形式と見なされますか?

前もって感謝します、

シド

以下は、「ビデオを再生できません。申し訳ありませんが、このビデオは再生できません」で失敗する 1 つのバージョンです。しかし、私には他にも多くの失敗モードがあります。内部ビデオを一時ストレージ (外部) にコピーして再生できるので、このコピーを内部にコピーすると実際に有効なムービーが作成されます。内部ストレージから直接再生しようとすると失敗します。

videoFile = new File(this.getFilesDir() + File.separator + "test.mp4");


InputStream data = res.openRawResource(R.raw.moviegood);


try {
    OutputStream myOutputStream = new FileOutputStream(videoFile);


    byte[] buffer = new byte[8192];
    int length;
    while ( (length = data.read(buffer)) > 0 ) {
        myOutputStream.write(buffer);
    }

    //Close the streams
    myOutputStream.flush();
    myOutputStream.close();
    data.close();
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}




vview.setKeepScreenOn(true);
vview.setVideoPath(videoFile.getAbsolutePath());
vview.start();
4

6 に答える 6

25

MediaPlayer では、再生中のファイルに誰でも読み取り可能なアクセス許可が必要です。ファイルのアクセス許可は、adb シェルで次のコマンドを使用して表示できます。

ls -al /data/data/com.mypackage/myfile

おそらく「-rw------」が表示されます。これは、所有者 (MediaPlayer ではなくアプリ) のみが読み取り/書き込み権限を持っていることを意味します。

注: ファイル (内部メモリ内) を指定せずに ls コマンドを使用するには、電話をルート化する必要があります。

電話がルート化されている場合は、次のコマンドを使用して、adb シェルに全世界読み取り権限を追加できます。

chmod o+r /data/data/com.mypackage/myfile

これらのアクセス許可をプログラムで変更する必要がある場合 (ルート化された電話が必要です!)、アプリ コードで次のコマンドを使用できます。

Runtime.getRuntime().exec("chmod o+r /data/data/com.mypackage/myfile");

これは基本的にLinuxコマンドです。chmod の詳細については、 https://help.ubuntu.com/community/FilePermissionsを参照してください。

編集:ここで別の簡単なアプローチを見つけました(ルート化された電話を持たない人に役立ちます)。アプリケーションはファイルを所有しているため、ファイル記述子を作成し、それを mediaPlayer.setDataSource() に渡すことができます。

FileInputStream fileInputStream = new FileInputStream("/data/data/com.mypackage/myfile");
mediaPlayer.setDataSource(fileInputStream.getFD());

このアプローチは、パーミッションの問題を完全に回避します。

于 2011-03-29T16:00:23.217 に答える
2

以下を使用できます。

videoView.setVideoURI(Uri.parse(file.getAbsolutePath()));

ファイルが誰でも読み取り可能である場合

または、コンテンツ プロバイダーを使用することもできます

于 2012-07-09T23:20:39.127 に答える
1

私は同じ問題でこのスレッドに出くわしました.Webからビデオを内部ストレージにダウンロードしています.保存時にRWモードを指定できることがわかりPRIVATEました.WORLD_READABLE

URL url = new URL(_url);
InputStream input = null;
FileOutputStream output = null;

try {
String outputName = "video.mp4";

input = url.openConnection().getInputStream();
output = c.openFileOutput(outputName, Context.MODE_WORLD_READABLE);

int read;
byte[] data = new byte[5120]; //5MB byte array
while ((read = input.read(data)) != -1)
output.write(data, 0, read);

return true;

} finally {
if (output != null)
   output.close();
if (input != null)
   input.close();
    }
}
于 2012-04-26T13:12:03.023 に答える
1

そこにカスタム VideoView 実装を投稿しました。

VideoView 実装にはsetVideoFD(FileDescriptor fd)メソッドがあり、この問題を解決します。

于 2011-11-11T19:09:59.833 に答える