0

APIDemo の MediaPlayer を使用して、ライブ壁紙でビデオ a.m4v を再生したいと考えています。私は次のコードを使用し、MediaPlayer アクティビティで正常に動作します。

       AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.a);
            mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());  

コードを LivWallpaperService に入れると失敗します。ファイルのパーミッションが原因だと思います。

04-05 12:32:58.598: D/MediaPlayerDemo(5308): onPrepared called
04-05 12:32:58.598: V/MediaPlayerDemo(5308): startVideoPlayback
04-05 12:32:59.153: D/MediaPlayerDemo(5308): player starting
04-05 12:33:00.004: E/MediaPlayer(5308): error (1, -19)
04-05 12:33:00.004: E/MediaPlayer(5308): Error (1,-19)

したがって、ファイルを一時ファイルにコピーしようとしましたが、それでもエラーが発生します。

                InputStream is = getResources().openRawResource(R.raw.a);

            File tempfile = File.createTempFile("mediaplayer", "temp",this.getCacheDir());
            String tempfilepath = tempfile.getAbsolutePath();
             FileOutputStream fo = new FileOutputStream(tempfile);
             BufferedOutputStream bis = new BufferedOutputStream(fo);

             int count = 0;
             byte buf[] = new byte[128];
             do {

              int numread = is.read(buf);
              count+=numread;
              if (numread <= 0)
               break;
              bis.write(buf, 0, numread);
             } while (true); 

             Log.d(TAG, "tempfile.length()"+tempfile.length());

             Log.d(TAG, is.toString());


             mMediaPlayer.setDataSource(tempfilepath)


04-05 12:46:36.981: E/MediaPlayerDemo(6000): error: null
04-05 12:46:36.981: E/MediaPlayerDemo(6000): java.lang.IllegalStateException
04-05 12:46:36.981: E/MediaPlayerDemo(6000):    at
android.media.MediaPlayer.setDataSource(Native Method)

AssetFileDescriptor から読み取れない理由を知っている人はいますか?

パッケージ内で作成したファイルを読み取れないのはなぜですか?

4

1 に答える 1

1

Android/assetはアプリケーション自体にしかアクセスできないため、アクセスできません。他のアプリケーションは、アプリケーションの /asset ディレクトリ内のリソースにアクセスできません。

internal storageしたがって、それをorにコピーしてexternal storage使用することをお勧めします。

/tempディレクトリ内のファイルにWORLD_READABLEアクセス許可があることを確認してください。

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_WORLD_READABLE);
fos.write(string.getBytes());
fos.close();
于 2012-04-05T05:17:41.723 に答える