2017-02-16 32 views
0

サンプルのmp4ビデオをアンドロイドの内部ストレージに保存しましたが、ファイルから読み込み、アンドロイドのビデオビューで再生しようとすると、ファイルパスをURIとして解析して、このビデオエラーを再生しないでください。私は多くのリンクをチェックしていましたが、使用しませんでした。どうすれば実装できますか?Android - ビデオの内部保存と再生を保存する

final String mFileName = "sample.mp4"; 
try{ 
     FileOutputStream mFileOutputStream = openFileOutput(mFileName, Context.MODE_PRIVATE); 
     mFileOutputStream.write(getResources().getAssets().open("sample_video.mp4").read()); 
     mFileOutputStream.close(); 
     Log.v(TAG, "Success"); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    MediaController mediaController = new MediaController(this); 
    mediaController.setAnchorView(mVideoView); 
    mVideoView.setMediaController(mediaController); 
    mVideoView.setVideoPath(getFilesDir().getAbsolutePath()+"/sample.mp4"); 
    mVideoView.start(); 

答えて

0

単純にできません。 VideoViewは内部でMediaPlayerを使用します。これは明示的にrequires a file to be world-readable(アプリケーションのディレクトリはありません)です。この制限を回避する唯一の方法は、ドキュメントの通り、ファイルパスではなくファイル記述子を渡すことです。

は残念ながらVideoViewsetDataSource(FileDescriptor)のようなメソッドを持っていないので、次の2つの方法があります:

  1. アクセスをVideoViewMediaPlayerthrough reflection、その上にsetDataSource(FileDescriptor)を呼び出します。 VideoView.setVideoPathに電話をかけたときに内部メディアプレーヤーがインスタンス化されるため、これが実行可能な解決策であるかどうかはわかりませんが、呼び出すべきではありません...要するに、評価しても致命的なものになる可能性があります。
  2. ビデオを再生するMediaPlayer,set a surface holderを使用し、MediaPlayerに直接FileDescriptorを渡します(この2番目の解決策はよりクリーンです)。
+0

コンテンツプロバイダを使用することは可能ですか? –

+0

コンテンツURI( 'VideoView.setVideoURI()')を渡すことで可能になるはずです。 'file://'のようなuriを渡さないでください。内部の 'MediaPlayer'が単に' setDataSource(String filepath) 'を呼び出すだけならば。 – Massimo

+0

あなたはもっと精巧にできますか?ContentProviderにファイルパスを入れるにはどうすればいいですか?また、ビデオビューのuriを渡すには –

関連する問題