Autore Topic: Caricamento immagine da galleria: open failed (permission denied)  (Letto 519 volte)

Offline teos

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
0
Buongiorno a tutti, sono un assiduo visitatore del sito, ma questo è in effetti il primo topic che apro.
Mi rivolgo a voi per risolvere un problema, che probabilmente sarà sciocco ma che, ad oggi, non sono riuscito a risolvere.
Ho creato un semplice layout con un Button e una ImageView.
Premendo sul Button, si accede alla gallery del cellulare, si seleziona la foto, con l'intento di mostrarle nella ImageView.
Accedo alla gallery seleziono l'immagine, ma fatto questo poi non riesco a mostrare la foto scelta nella mia TextView.
Ho provato diverse soluzioni, ma niente.
In pratica, è come se non richiamassi proprio l'immagine. Premetto che ho inserito l'autorizzazione sia nel Manifest, sia nella MainActivity.
Ecco il mio layout:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.finger.mi.selectimage.MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="15dp"
        android:text="pick_button" />

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
         />
</RelativeLayout>


e la MainActivity.java
public class MainActivity extends Activity implements OnClickListener {




    // Image loading result to pass to startActivityForResult method.
    private static int LOAD_IMAGE_RESULTS = 1;

    // GUI components
    private Button button;  // The button
    private ImageView image;// ImageView

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Find references to the GUI objects
        button = (Button)findViewById(R.id.button);
        image = (ImageView)findViewById(R.id.image);

        // Set button's onClick listener object.
        button.setOnClickListener(this);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Here we need to check if the activity that was triggers was the Image Gallery.
        // If it is the requestCode will match the LOAD_IMAGE_RESULTS value.
        // If the resultCode is RESULT_OK and there is some data we know that an image was picked.
        if (requestCode == LOAD_IMAGE_RESULTS && resultCode == RESULT_OK && data != null) {
            // Let's read picked image data - its URI
            Uri pickedImage = data.getData();
            // Let's read picked image path using content resolver
            String[] filePath = { MediaStore.Images.Media.DATA };
            Cursor cursor = getContentResolver().query(pickedImage, filePath, null, null, null);
            cursor.moveToFirst();
            String imagePath = cursor.getString(cursor.getColumnIndex(filePath[0]));

            // Now we need to set the GUI ImageView data with data read from the picked file.
            image.setImageBitmap(BitmapFactory.decodeFile(imagePath));

            // At the end remember to close the cursor or you will end with the RuntimeException!
            cursor.close();
        }
    }

    @Override
    public void onClick(View v) {
        // Create the Intent for Image Gallery.
        Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

        // Start new activity with the LOAD_IMAGE_RESULTS to handle back the results when image is picked from the Image Gallery.
        startActivityForResult(i, LOAD_IMAGE_RESULTS);
    }

    // Storage Permissions
    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    /**
     * Checks if the app has permission to write to device storage
     *
     * If the app does not has permission then the user will be prompted to grant permissions
     *
     * @param activity
     */
    public static void verifyStoragePermissions(Activity activity) {
        // Check if we have write permission
        int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

        if (permission != PackageManager.PERMISSION_GRANTED) {
            // We don't have permission so prompt the user
            ActivityCompat.requestPermissions(
                    activity,
                    PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE
            );
        }
    }
}


e questo è l'errore che ottengo, inesorabilmente, come una punizione divina, quando seleziono la foto dalla galleria:
E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/IMG_20160507_024500.jpg: open failed: EACCES (Permission denied)

GRAZIE mille a chi vorrà aiutarmi.
 :-)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 582
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Caricamento immagine da galleria: open failed (permission denied)
« Risposta #1 il: 06 Giugno 2016, 11:26:10 CEST »
0
I permessi di accesso in lettura li hai definiti, nel manifest?

Codice (XML): [Seleziona]
<manifest>
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  ...
  <application>
    ...
  </application>
</manifest>
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline teos

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
Re:Caricamento immagine da galleria: open failed (permission denied)
« Risposta #2 il: 06 Giugno 2016, 12:41:59 CEST »
0
Ciao Ohmnibus,
intanto grazie per la risposta.

Sì, ho inserito i permessi, ma non carica la foto comunque. Davvero non riesco a capire.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 582
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Caricamento immagine da galleria: open failed (permission denied)
« Risposta #3 il: 06 Giugno 2016, 13:49:43 CEST »
0
L'errore è chiaro: l'app non ha il permesso di andare a leggere la risorsa.

Vedo il metodo verifyStoragePermissions che dovrebbe verificare ed eventualmente richiedere i permessi di accesso, ma non viene mai invocato. E' voluto?
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline teos

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
Re:Caricamento immagine da galleria: open failed (permission denied)
« Risposta #4 il: 06 Giugno 2016, 15:31:26 CEST »
0
mmm, no, non è voluto..Pensavo di averlo invocato. Cosa dovrei fare? :-X
Altra cosa: cosa intendi esattamente con "non ha il permesso di andare a leggere la risorsa"? Perché quando clicco sul Button mi accede alla Gallery, solo che poi non mostra la foto selezionata.

P.S. Se sei a conoscenza di un codice migliore per caricare immagini dalla gallery e se volessi condividerlo, sono ben contento di leggerlo (anche msg pvt in caso!).

Ad ogni modo, grazie per l'aiuto!

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 582
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Caricamento immagine da galleria: open failed (permission denied)
« Risposta #5 il: 06 Giugno 2016, 16:51:06 CEST »
0
Beh, direi che devi invocare verifyStoragePermissions prima di tentare di aprire il file, anche se avendo implementato quel metodo dovresti essere tu a sapere a cosa serve...

La questione sui permessi a richiesta è spiegata meglio qui: https://developer.android.com/training/permissions/requesting.html#perm-request
e da quello che scrivi mi pare di capire che non hai richiesto la conferma all'utente per l'uso dei permessi.

Citazione
Perché quando clicco sul Button mi accede alla Gallery, solo che poi non mostra la foto selezionata.

Quando premi sul button di fatto stai aprendo un'altra applicazione che accede alla gallery. Questa seconda applicazione restituisce alla tua un'indicazione sulla posizione dell'immagine (URI). Il problema è che la tua applicazione non può caricare l'immagine perché non ha i permessi di lettura.

Quindi l'apertura della gallery non ha nulla a che fare con i permessi della TUA app (tant'è vero che se fai la prova di togliere i permessi alla tua app la gallery si apre lo stesso).

P.S.: Questo è un forum per imparare e permettere agli altri di imparare, non esiste condividere conoscenze tramite pvt.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline teos

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
Re:Caricamento immagine da galleria: open failed (permission denied)
« Risposta #6 il: 06 Giugno 2016, 17:15:29 CEST »
0
Il punto è che pensavo di avere già introdotto lai scelta se concedere la permission inserendo questa parte di codice:

 if (permission != PackageManager.PERMISSION_GRANTED) {
            // We don't have permission so prompt the user
            ActivityCompat.requestPermissions(
                    activity,
                    PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE
            );
        }

A quanto pare mi sbagliavo. Mannaggia. Tra l'altro, mi dà un problema simile anche quando cerco di salvare un'immagine del layout as .jpg  :'(

P.S. quanto alla precisazione del pvt hai ragione.
P.P.S. tra l'altro ho provato anche altri codici, seguendo diversi tutorial, ma niente. In qualche modo il problema potrebbe dipendere da queste autorizzazioni richieste da API 23 in poi..
 

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 582
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Caricamento immagine da galleria: open failed (permission denied)
« Risposta #7 il: 06 Giugno 2016, 17:18:41 CEST »
0
Citazione
Il punto è che pensavo di avere già introdotto lai scelta se concedere la permission inserendo questa parte di codice:

Sì, ma quel codice non lo invochi mai!

Se non hai problemi con l'inglese, leggi la guida che ti ho linkato.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline teos

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
Re:Caricamento immagine da galleria: open failed (permission denied)
« Risposta #8 il: 06 Giugno 2016, 17:20:13 CEST »
0
Grazie mille  ;-) ora leggo, sperando di risolvere! Ti farò sapere

Disponibilissimo, ancora grazie