2017-12-26 5 views
1

Ich versuche einfach, URI von einer Aktivität zur anderen zu übergeben. Und dabei bemerkte ich, dass ich eine Ausnahme für keine Datei gefunden hatte und konnte sehen, dass die End-Dateinamen nicht identisch waren, indem ich sie ausgab. (Nur die path String und uri.getEncodedPath())Android: Uri Dateiname Verwirrung

Also habe ich versucht, die Zeichenfolge zu senden und Rekonstruieren des uri wie folgt:

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); 

und die Protokolle

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 

Sind

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 

gleichwertig?

Offensichtlich der Ladevorgang fehlgeschlagen, weil es eine solche Datei nicht finden konnte. (Ich habe den Pfad überprüft und eine Datei mit dem Dateinamen existiert im Pfad).

Kann mir jemand erklären, warum Uri.parse() oder Uri.fromFile(new file(path)) versucht, einen anderen Dateinamen als das Original zu erstellen?

Warum scheint Android nicht zu mögen JPEG_20171226_041803672615875 aber JPEG_20171226_041746-1723016833 und auf welcher Basis ändert es?


Hinweis: Ich versuche tat Uri direkt zu senden data.putExtra() und data.getParcelableExtra() verwenden. Sie geben die gleichen Ergebnisse, als ob ich die Saite geschickt hätte und daraus einen Uri konstruiert hätte.


UPDATE: ich File.createTempFile() bin mit, die eine Zufallszahl am Ende anfügt. Selbst wenn FilesProvider eine eigene Referenz generiert, sollte er den ursprünglichen Dateinamen, der JPG_date_time ist, nicht berühren.

Während ich beobachte, was es verändert hat, habe ich gerade diese seltsame Sache bemerkt!

|......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......| 

Es ist die ersten 16 Zeichen konservierende ... !!! Das gibt mir das Gefühl, dass es etwas mit der Länge zu tun hat.

+0

Ich empfehle Ihnen, verweisen Sie https://developer.android.com/training/secure-file-sharing/setup-sharing.html –

+0

Werfen Sie einen Blick auf photoUri.toString(). – greenapps

+0

Ich bin überrascht, warum dieses 16 Char-Zeug in den Dokumenten nicht als Warnung erwähnt wird –

Antwort

0

Es war seltsam die Länge, die das Problem verursacht wurde.

Halten Sie den Dateinamen unter 16 Zeichen löst das Problem. Ja, funktioniert genauso, ohne dass Änderungen erforderlich sind. Beachten Sie, wenn Sie File.createTempFile() verwenden, wird es 5 oder mehr Zeichen hinzufügen (In meinem Fall war es 9) wie erwähnt here.

Obwohl dies das Problem für jetzt löst, führt dies zu einer anderen Frage: Was ist, wenn ich 16 Zeichen wollte?

-3

Wenn Sie Uri Form einer Aktivität auf eine andere Tätigkeit übergeben wollen, so wenden Sie sich bitte Absicht wie folgt verwenden:

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();