2017-10-23 10 views
0

AndroidでMediaRecorderでストレージアクセスフレームワーク(SAF)を使用したいと考えています。しかし、SAFスキームの下では、絶対パスに頼るべきではなく、これまでに権限を持っていたUriに依存するべきです。ストレージアクセスフレームワーク内のMediaRecorderのSetOutputFile

どのようにうまくいくのですか?AndroidのSAFの新しいアプローチで一貫してMediaRecorderを使用するにはどうすればよいですか? あなたはここからスタート(よく文書)出発点として、言ってみましょう:

List<UriPermission> permission= getContentResolver().getPersistedUriPermissions(); 

そして、あなたがそこに取得したい:

mMediaRecorder.setOutputFile(/*Some arguments*/); 
mMediaRecorder.prepare(); 

中間ステップは何ですか?

答えて

0

あなたはUriによって識別されるコンテンツにFileDescriptorを取得するには、ContentResolveropenFileDescriptor()を試して歓迎されています。その後、MediaRecordersetOutputFile()のバージョンにそれを渡します。これはFileDescriptorです。これがうまくいくかどうかは、記録しているものと、ドキュメントプロバイダがシークをサポートしているかどうかによって大きく異なります(これは、Uriが通常のファイルに裏打ちされているかどうかによってかなり変わります)。

+0

openFileDescriptorはandroid.net.ParcelFileDescriptorを返し、setOutputFileはjava.io.FileDescriptorをとります。私が見るところでは、システムは変換を許可しません。何か不足していますか?ご回答どうもありがとうございました。 –

+0

ええ、私は覚えています、私はこれを直前に試しました:FileDescriptor fileDescriptor = getContentResolver()。openFileDescriptor(mUri、 "rwt")。getFileDescriptor();しかし、私はこれを取得:E/JavaBinder:***キャッチリモート例外! (例外はプロセス間ではまだサポートされていません) java.lang.StringIndexOutOfBoundsException:length = 21; regionStart = 0; regionLength = -1 at java.lang.String.startEndAndLength ... –

+0

@SylOR:メッセージが何を意味するのか分かりません。 FWIW、[このサンプルアプリケーション](https://github.com/commonsguy/cw-omnibus/tree/v8.7/Media/AudioRecordStream)では、 'MediaRecorder'で' FileDescriptor'を使用しています。私の場合は、シークをサポートしていない 'ParcelFileDescriptor'パイプを使用しています。私のサンプルは、 'RAW_AMR'を記録しているので動作しますが、シークは必要ありません。最後に、 'FileDescriptor'アプローチがうまくいかない場合は、最初に普通のファイルに記録し、次にメディアを' Uri'で指定されたコンテンツにコピーする必要があります。 – CommonsWare

関連する問題