2016-12-22 8 views
-2

Ich bekomme Bild von Galerie/Capture mit Kamera. dann möchte ich das Bild bei Bedarf ändern und es an der gleichen Stelle speichern. Dazu verwende ich den folgenden Code:Dateieinschränkungen in android Nougat

File file = new File(photoLocation); 
file.setWritable(true); 
try { 
    if(ContextCompat.checkSelfPermission(getApplicationContext(),Manifest.permission.WRITE_EXTERNAL_STORAGE)==PackageManager.PERMISSION_GRANTED) { 
     FileOutputStream fileOutputStream = new FileOutputStream(file); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 50, fileOutputStream); 
     fileOutputStream.flush(); 
     fileOutputStream.close(); 
    }else{ 
     requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1); 
    } 

Leider bekomme ich

FileNotFound error (permission denied)

ich den gleichen Code auf Android 4 Gerät ausprobiert und es funktioniert ok so gehe ich davon aus, weil die Dateizugriffsbeschränkungen ist in android 7.
Wie kann ich jetzt in Datei schreiben?

Auch der Fehler:

W/System.err: java.io.FileNotFoundException: /storage/3061-6133/DCIM/Camera/20161213_081733.jpg (Permission denied) 12-22 23:55:00.269 28524-28736/com.hadas.yotam.manchworkers W/System.err: at java.io.FileOutputStream.open(Native Method) 12-22 23:55:00.270 28524-28736/com.hadas.yotam.manchworkers W/System.err: at java.io.FileOutputStream.(FileOutputStream.java:221) 12-22 23:55:00.270 28524-28736/com.hadas.yotam.manchworkers W/System.err:
at java.io.FileOutputStream.(FileOutputStream.java:169) 12-22 23:55:00.270 28524-28736/com.hadas.yotam.manchworkers W/System.err:
at com.hadas.yotam.manchworkers.ProductActivity$BitmapGetter.doInBackground(ProductActivity.java:465) 12-22 23:55:00.270 28524-28736/com.hadas.yotam.manchworkers W/System.err: at com.hadas.yotam.manchworkers.ProductActivity$BitmapGetter.doInBackground(ProductActivity.java:410) 12-22 23:55:00.270 28524-28736/com.hadas.yotam.manchworkers W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:304) 12-22 23:55:00.270 28524-28736/com.hadas.yotam.manchworkers W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237) 12-22 23:55:00.270 28524-28736/com.hadas.yotam.manchworkers W/System.err:
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 12-22 23:55:00.270 28524-28736/com.hadas.yotam.manchworkers W/System.err:
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 12-22 23:55:00.270 28524-28736/com.hadas.yotam.manchworkers W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 12-22 23:55:00.270 28524-28736/com.hadas.yotam.manchworkers W/System.err: at java.lang.Thread.run(Thread.java:761)

+0

Wohin genau 'Datei' zeigt? IOW, was ist der Wert von "photoLocation"? – CommonsWare

+0

@CommonsWare mein Fehler vergessen, den Fehler hinzuzufügen, edited ich den Beitrag mit dem Fehler (Ort ist in der ersten Zeile Fehler) –

+0

Ich weiß nicht, wie Sie diesen Pfad ('/ Speicher/3061-6133/DCIM/Kamera/20161213_081733.jpg'). Es sieht so aus, als ob es sich um einen Wechseldatenträger handelt und [Sie haben seit Android 4.4 weder Lese- noch Schreibzugriff auf beliebige Speicherorte auf Wechseldatenträgern] (https://commonsware.com/blog/2014/04/09/storage-situation- Wechselspeicher.html). – CommonsWare

Antwort

0

I open gallery using StartActivityForResault() and pick image, I then use the data.getData() to get the url and a cursor to get the path.

Befreien Sie sich von dem Teil "und einem Cursor, um den Weg zu bringen". Verwenden Sie einen ContentResolver und openInputStream() und openOutputStream(), um mit dem Inhalt zu arbeiten, der von Uri identifiziert wird. Ihr bitmap.compress() Aufruf würde zum Beispiel mit der OutputStream von openOutputStream() arbeiten.

+0

Ich brauche den Cursor, um den Pfad zu bekommen, damit ich ExifInterface benutzen kann. –

+0

BTW Ich habe gerade eine neue Datei erstellt, anstatt zu versuchen, die neue Datei zu ändern. (Ich habe openOutPutSteam() verwendet, um in diese Datei zu schreiben, danke für Ihre Hilfe) –

+1

@yotamhadas: "Ich muss den Cursor verwenden, um den Pfad zu erhalten, damit ich ExifInterface verwenden kann" - nicht, wenn Sie ein besseres 'ExifInterface verwenden ', wie zum Beispiel [der gerade in die Support-Bibliothek aufgenommen wurde] (https://android-developers.googleblog.com/2016/12/introducing-the-exifinterface-support-library.html). Der, den Sie verwenden [hat Sicherheitsmängel] (https://commonsware.com/blog/2016/09/08/dealing-exifinterface-security-flaw.html). – CommonsWare

Verwandte Themen