2017-12-26 21 views
1

私は単に、あるアクティビティから別のアクティビティへuriを渡そうとしています。そして、その間、ファイルが見つからないという例外が発生したことに気がつき、最終ファイル名が印刷されていないことがわかりました。 (ただ、path文字列とuri.getEncodedPath()Android:Uriファイル名の混乱

だから私は、文字列を送信すると、次のようにURIを再構築しようとした:

Log.e("debug_path_string", data.getExtras().getString(CONSTANT)); 

# try { Uri photoUri = Uri.fromFile(new File(data.getExtras().getString(CONSTANT))); } 
try { Uri photoUri = Uri.parse(data.getExtras().getString(CONSTANT)); } 
catch (Exception e) { Log.e("IO", e.getMessage()); } 

Log.d("debug", photoUri.getEncodedPath()); 
pageListAdapter.append(photoUri); 

とログ

12-26 04:18:04.172 4425-4425/com.example.myawesomeapp E/debug_path_string: /storage/emulated/0/Android/data/com.example.myawesomeapp/files/Pictures/JPEG_20171226_041803672615875.jpg 
12-26 04:18:04.172 4425-4425/com.example.myawesomeapp D/debug: /document_images/JPEG_20171226_041746-1723016833.jpg 
12-26 04:18:04.225 4425-4425/com.example.myawesomeapp W/Glide: Failed to find GeneratedAppGlideModule. You should include an annotationProcessor compile dependency on com.github.bumptech.glide:compiler in your application and a @GlideModule annotated AppGlideModule implementation or LibraryGlideModules will be silently ignored 
12-26 04:18:04.400 4425-4425/com.example.myawesomeapp W/Glide: Load failed for content://com.example.myawesomeapp.fileprovider/document_images/JPEG_20171226_041746-1723016833.jpg 

file://storage/emulated/0/Android/data/com.example.myawesomeapp/files/Pictures/JPEG_20171226_041803672615875.jpg 
content://com.example.myawesomeapp.fileprovider/document_images/JPEG_20171226_041746-1723016833.jpg 

# provided 
# com.example.myawesomeapp.fileprovider/document_images resolves path 
# storage/emulated/0/Android/data/com.example.myawesomeapp/files/Pictures 

です同等ですか?

明らかに、このようなファイルが見つからなかったため、読み込みに失敗しました。 (私は、パスと文字列パスに存在するファイル名のファイルをチェックしています)。

Uri.parse()またはUri.fromFile(new file(path))が元のファイル名と異なるファイル名を作成しようとした理由を教えてもらえますか?

なぜAndroidはJPEG_20171226_041803672615875ではなくJPEG_20171226_041746-1723016833と嫌いで、どのような基準で変更されるのですか?


注:私は直接data.putExtra()data.getParcelableExtra()を使用してUriを送信してみました。彼らは私が弦を送ってそれからUriを作ったのと同じ結果を出しています。


UPDATE:私は最後に乱数を付加しFile.createTempFile()を使用してい。 FilesProviderが独自の参照を生成していても、元のファイル名であるJPG_date_timeには触れてはいけません。

何が変わったのかを観察しながら、この奇妙なことに気づいただけです!

|......16.......||.......rest......| 

JPEG_20171226_041803672615875.jpg 
JPEG_20171226_041746-1723016833.jpg 

# Running one more example 
JPEG_20171226_121309-2003514507.jpg 
JPEG_20171226_121239-882490989.jpg 

|......16.......||.......rest......| 

最初の16文字を保存しています... !!!これは私がそれが間違いなく長さと関係があると感じさせる。あなたが別のアクティビティへのURIフォームつの活性を渡したい場合は

+0

https://developer.android.com/training/secure-file-sharing/setup-sharing.html –

+0

photoUri.toString()をご覧ください。 – greenapps

+0

私はこの16文字のものは、警告としてもドキュメントに記載されていない理由に驚いています –

答えて

0

それは奇妙な問題を引き起こしていた長さでした。

ファイル名を16文字未満にすると問題は解決します。はい、変更は必要ありません。 File.createTempFile()を使用している場合は、(私の場合は9)のように5文字以上の文字が追加されます(here)。

これで問題は解決しますが、別の質問につながります。16文字以上の文字が必要な場合はどうなりますか?

-3

ので、このよう意図を使用してください:

Uri Uri1=new Uri(); 
class A: 
Intent intent=new Intent(A.this,B.class) 
intent.set Data(Uri1); 
start Activity(intent); 
Class B 
Intent intent=getIntent(); 
Uri uri=intent.getData();