2017-10-09 3 views
0

私のアプリケーションからサーバーにファイルをアップロードしようとしています。ユーザーは、内部ストレージからファイルを添付することができます。しかし、Nougatの電話機から得られる経路は、標準/storage/emulated/0/...とはいくつか異なっています。いくつかの携帯電話で私はexternal_files/...を取得し、他の人はroot_files/storage/999/....を取得します。この場合、私はファイルの正しいパスを取得していません。このシナリオはどのように扱いますか?ファイルを添付してサーバーにアップロードする - Android Nougat

マイコード:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
     Uri selectedImageUri = data.getData(); 
     String filePath = data.getData().getPath(); 
     File sourceFile = new File(fileFields.get(i).getFileName()); 
     FileInputStream fileInputStream = new FileInputStream(sourceFile); 
    } 
} 

答えて

0

Uriはファイルではありません。 Uriのスキームがfileである場合を除き、getPath()は無意味です。これは、新しいAndroid搭載端末ではあまり一般的ではありません。代わりに、スキームはcontentになり、getPath()はあなたにとって役に立たなくなります。

代わりに、filecontentUri両方の値のため、Uriによって識別されるコンテンツにInputStreamを取得するためにContentResolveropenInputStream()を使用しています。このアプローチは、Android 1.0にまで一貫して機能します。

+0

私に例を教えていただけますか?私は 'ContentResolver'を使用しようとしましたが、' cursor.moveToFirst() 'で' NPE'を取得します。 –

+0

@SahanaPrabhakar:私の答えは 'Cursor'を伴わない。私は 'openInputStream()'を呼び出すと言った。 'openInputStream()'は 'Cursor'を返しません。 'openInputStream()'は 'InputStream'を返します。したがって、 'getContentResolver()。openInputStream(selectedImageUri)'はあなたに 'Uri'によって識別される内容の' InputStream'を与えます。 – CommonsWare

関連する問題