Permission denied salvando immagini nell'external storage

di il
5 risposte

Permission denied salvando immagini nell'external storage

Salve a tutti,
di seguito un codice che:
- copia un'immagine nell'internal storage (data/data/myproject/...)
- effettua una manipolazione sull'immagine (codice qui commentato)
- salva una nuova foto (copia di quella manipolata) sull'external storage.

Risultato NEGATIVO: Permission Denied. Ecco il codice:

    public class MainActivity extends ActionBarActivity {
    	private static final int REQUEST_CODE = 1;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    	}
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
    
    	@Override
    	public boolean onOptionsItemSelected(MenuItem item) {
    		// Handle action bar item clicks here. The action bar will
    		// automatically handle clicks on the Home/Up button, so long
    		// as you specify a parent activity in AndroidManifest.xml.
    		int id = item.getItemId();
    		if (id == R.id.action_settings) {
    			return true;
    		}
    		return super.onOptionsItemSelected(item);
    	}
    	
    
    	public void openActivity(View view){
    		Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    	    intent.setType("image/jpeg");
    	    startActivityForResult(Intent.createChooser(intent,"Select iamge"), REQUEST_CODE);
    	}
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        	if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK){
        		String image_path = getRealPathFromUri(this, data.getData());
        		File externalInput = new File(image_path);
        		File internalCopy = new File(getFilesDir(), temp_image.replace(".jpg", ".OUT.jpg"));
        		File externalCopy = new File(image_path.replace(".jpg", ".OUT.jpg"));
        		
        		try {
    				copyFile(new FileInputStream(externalInput),new FileOutputStream(internalCopy));
    				System.out.println("Copied into internal Storage OK");
    			} catch (FileNotFoundException e) {
    				// TODO Auto-generated catch block
    				System.out.println("NOT Copied into internal Storage ERR");
    				e.printStackTrace();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}


        		/* here some image manipulation are performed */



        		if(!externalCopy.getParentFile().exists()){
        			externalCopy.getParentFile().mkdirs();
        			System.out.println("Created directories ...");
        		}else{
        			System.out.println("Directories already OK");
        		}
        		
        		try {
    				copyFile(new FileInputStream(internalCopy),new FileOutputStream(externalCopy));
    				System.out.println("Copied into external Storage OK");
    			} catch (FileNotFoundException e) {
    				// TODO Auto-generated catch block
    				System.out.println("NOT Copied into external Storage ERR");
    				e.printStackTrace();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    				System.out.println("NOT Copied into external Storage ERR");
    			}
        	}
        	
            super.onActivityResult(requestCode, resultCode, data);
        }
    	
    	public void quitActivity(View view){
    		android.os.Process.killProcess(android.os.Process.myPid());
    		System.exit(1);		
    	}
    
    	 public static String getRealPathFromUri(Context context, Uri contentUri) {
    		    Cursor cursor = null;
    		    try {
    		        String[] proj = { MediaStore.Images.Media.DATA };
    		        cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
    		        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    		        cursor.moveToFirst();
    		        return cursor.getString(column_index);
    		    } finally {
    		        if (cursor != null) {
    		            cursor.close();
    		        }
    		    }
    	 }
    	 
    	 public void copyFile(InputStream in, OutputStream out) throws IOException {
    	     byte[] buffer = new byte[1024];
    	     int read;
    	     while((read = in.read(buffer)) != -1){
    	       out.write(buffer, 0, read);
    	     }
    	 }
    
    }
Se provo externalCopy.getParentFile().canWrite() il risultato e' falso. Ecco il LogCat output:

    12-01 22:02:02.271: D/ActivityThread(22255): setTargetHeapUtilization:0.25
    12-01 22:02:02.271: D/ActivityThread(22255): setTargetHeapIdealFree:8388608
    12-01 22:02:02.271: D/ActivityThread(22255): setTargetHeapConcurrentStart:2097152
    12-01 22:02:02.601: I/dalvikvm(22255): Could not find method android.view.ViewGroup.onNestedScrollAccepted, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.onNestedScrollAccepted
    12-01 22:02:02.601: W/dalvikvm(22255): VFY: unable to resolve virtual method 11385: Landroid/view/ViewGroup;.onNestedScrollAccepted (Landroid/view/View;Landroid/view/View;I)V
    12-01 22:02:02.601: D/dalvikvm(22255): VFY: replacing opcode 0x6f at 0x0000
    12-01 22:02:02.601: I/dalvikvm(22255): Could not find method android.view.ViewGroup.onStopNestedScroll, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.onStopNestedScroll
    12-01 22:02:02.601: W/dalvikvm(22255): VFY: unable to resolve virtual method 11391: Landroid/view/ViewGroup;.onStopNestedScroll (Landroid/view/View;)V
    12-01 22:02:02.601: D/dalvikvm(22255): VFY: replacing opcode 0x6f at 0x0000
    12-01 22:02:02.621: I/dalvikvm(22255): Could not find method android.support.v7.internal.widget.ActionBarOverlayLayout.stopNestedScroll, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.setHideOnContentScrollEnabled
    12-01 22:02:02.621: W/dalvikvm(22255): VFY: unable to resolve virtual method 8963: Landroid/support/v7/internal/widget/ActionBarOverlayLayout;.stopNestedScroll ()V
    12-01 22:02:02.621: D/dalvikvm(22255): VFY: replacing opcode 0x6e at 0x000e
    12-01 22:02:02.661: I/dalvikvm(22255): Could not find method android.view.ViewGroup.onRtlPropertiesChanged, referenced from method android.support.v7.widget.Toolbar.onRtlPropertiesChanged
    12-01 22:02:02.661: W/dalvikvm(22255): VFY: unable to resolve virtual method 11388: Landroid/view/ViewGroup;.onRtlPropertiesChanged (I)V
    12-01 22:02:02.661: D/dalvikvm(22255): VFY: replacing opcode 0x6f at 0x0007
    12-01 22:02:02.671: I/dalvikvm(22255): Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations
    12-01 22:02:02.671: W/dalvikvm(22255): VFY: unable to resolve virtual method 366: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
    12-01 22:02:02.671: D/dalvikvm(22255): VFY: replacing opcode 0x6e at 0x0002
    12-01 22:02:02.671: I/dalvikvm(22255): Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType
    12-01 22:02:02.671: W/dalvikvm(22255): VFY: unable to resolve virtual method 388: Landroid/content/res/TypedArray;.getType (I)I
    12-01 22:02:02.671: D/dalvikvm(22255): VFY: replacing opcode 0x6e at 0x0002
    12-01 22:02:02.901: D/libEGL(22255): loaded /system/lib/egl/libEGL_adreno200.so
    12-01 22:02:02.941: D/libEGL(22255): loaded /system/lib/egl/libGLESv1_CM_adreno200.so
    12-01 22:02:02.941: D/libEGL(22255): loaded /system/lib/egl/libGLESv2_adreno200.so
    12-01 22:02:02.941: I/Adreno200-EGL(22255): <qeglDrvAPI_eglInitialize:299>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_JB_REL_2.0.3.04.01.02.21.107_msm8625_JB_REL_2.0.3_CL3357771_release_AU (CL3357771)
    12-01 22:02:02.941: I/Adreno200-EGL(22255): Build Date: 02/25/13 Mon
    12-01 22:02:02.941: I/Adreno200-EGL(22255): Local Branch: 
    12-01 22:02:02.941: I/Adreno200-EGL(22255): Remote Branch: quic/jb_rel_2.0.3
    12-01 22:02:02.941: I/Adreno200-EGL(22255): Local Patches: NONE
    12-01 22:02:02.941: I/Adreno200-EGL(22255): Reconstruct Branch: AU_LINUX_ANDROID_JB_REL_2.0.3.04.01.02.21.107 +  NOTHING
    12-01 22:02:03.041: D/OpenGLRenderer(22255): Enabling debug mode 0
    12-01 22:02:11.861: D/AbsListView(22255): Get MotionRecognitionManager
    12-01 22:02:17.711: I/System.out(22255): Copied into internal Storage OK
    12-01 22:02:17.711: I/System.out(22255): Directories already OK
    12-01 22:02:17.721: I/System.out(22255): NOT Copied into external Storage ERR
    12-01 22:02:17.731: W/System.err(22255): java.io.FileNotFoundException: /storage/sdcard0/DCIM/Camera/20141201_185225.OUT.jpg: open failed: EACCES (Permission denied)
    12-01 22:02:17.761: W/System.err(22255): 	at libcore.io.IoBridge.open(IoBridge.java:416)
    12-01 22:02:17.761: W/System.err(22255): 	at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
    12-01 22:02:17.761: W/System.err(22255): 	at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
    12-01 22:02:17.761: W/System.err(22255): 	at it.pittuzzo.fucre.MainActivity.onActivityResult(MainActivity.java:91)
    12-01 22:02:17.761: W/System.err(22255): 	at android.app.Activity.dispatchActivityResult(Activity.java:5387)
    12-01 22:02:17.761: W/System.err(22255): 	at android.app.ActivityThread.deliverResults(ActivityThread.java:3205)
    12-01 22:02:17.771: W/System.err(22255): 	at android.app.ActivityThread.handleSendResult(ActivityThread.java:3252)
    12-01 22:02:17.771: W/System.err(22255): 	at android.app.ActivityThread.access$1200(ActivityThread.java:143)
    12-01 22:02:17.771: W/System.err(22255): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289)
    12-01 22:02:17.771: W/System.err(22255): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    12-01 22:02:17.771: W/System.err(22255): 	at android.os.Looper.loop(Looper.java:137)
    12-01 22:02:17.771: W/System.err(22255): 	at android.app.ActivityThread.main(ActivityThread.java:4960)
    12-01 22:02:17.781: W/System.err(22255): 	at java.lang.reflect.Method.invokeNative(Native Method)
    12-01 22:02:17.781: W/System.err(22255): 	at java.lang.reflect.Method.invoke(Method.java:511)
    12-01 22:02:17.781: W/System.err(22255): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
    12-01 22:02:17.781: W/System.err(22255): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
    12-01 22:02:17.781: W/System.err(22255): 	at dalvik.system.NativeStart.main(Native Method)
    12-01 22:02:17.781: W/System.err(22255): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)
    12-01 22:02:17.781: W/System.err(22255): 	at libcore.io.Posix.open(Native Method)
    12-01 22:02:17.781: W/System.err(22255): 	at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
    12-01 22:02:17.781: W/System.err(22255): 	at libcore.io.IoBridge.open(IoBridge.java:400)
    12-01 22:02:17.791: W/System.err(22255): 	... 16 more
    12-01 22:02:19.761: I/Process(22255): Sending signal. PID: 22255 SIG: 9
Per completezza ecco le prime righe del file ManifestActivity.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="it.pittuzzo.fucre"
        android:versionCode="1"
        android:versionName="1.0" >
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
        <uses-sdk
            android:minSdkVersion="14"
            android:targetSdkVersion="21" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
I miei test sono effettuati su dispositivi reali (non virtuali): Mobile Samsung Core con Android 4.1.2 e Tablet Samsung Note 2014 con Andorid 4.3.
Non credo sia un problema di codice perche' ho anche provato a copiare/incollare diversi esempi trovati sul web funzionanti... ma sempre lo stesso risultato.. Qualcuno puo' provare il codice in parallelo giusto per sicurezza?

Avete consigli?

5 Risposte

Devi accedere o registrarti per scrivere nel forum
5 risposte