2016-04-24 6 views
1

Ich habe dieses scheinbar einfachen CodeContentResolver openInputStream() throws FileNotFound auf vorhandene Datei

File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
File testfile = new File(path,"image.jpg"); 

Log.d(TAG,"testfile: " + testfile + " exists: " + testfile.exists()); 

Uri uri = Uri.fromFile(testfile); 
ContentResolver cr = context.getContentResolver(); 
InputStream istr = cr.openInputStream(uri); 

Die Ausgabe lautet:

testfile: /storage/emulated/0/Pictures/image.jpg exists: true 

Der uri Wert ist file:///storage/emulated/0/Pictures/image.jpg. Sieht aus wie die gleiche Datei, aber der openInputStream() löst eine FileNotFoundException aus.

Irgendeine Idee warum? Dies ist auf Android 6.0.1.

+1

Haben Sie ein 'READ_EXTERNAL_STORAGE'- oder' WRITE_EXTERNAL_STORAGE' '' - Element in Ihrem Manifest? Wenn Ihre 'targetSdkVersion' 23 oder höher ist, haben Sie die Berechtigung zur Laufzeit angefordert? Siehe https://commonsware.com/blog/2015/08/31/hey-where-did-my-permission-go.html für mehr Möglichkeiten. – CommonsWare

+0

Ja, richtig. targetSdkVersion ist 23 und ich habe die Erlaubnis nicht angefordert. Vielen Dank. War verwirrt, weil es in der Vergangenheit funktionierte ... – farindk

Antwort

1

Fügen Sie diese Erlaubnis zu Ihrer AndroidManifest.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Wenn targetSdkVersion 23 oder höher (Android 6), das in der AndroidManifest.xml setzen ist nicht genug, und Sie haben die Erlaubnis zur Laufzeit verlangen.

+0

Dies ist in meinem AndroidManifest.xml, aber wie von 'CommonsWare' in einem Kommentar zu meiner Frage erwähnt, erhöhte ich targetSdkVersion 23 und muss jetzt die Erlaubnis zur Laufzeit anfordern. Ich habe das zu deiner Antwort hinzugefügt. – farindk