Android-Lese-Bilder-Berechtigung Externen Speicher

Möchte ich zum Lesen und speichern von Bildern /Bitmaps aus dem internen Speicher.

In meinem layout habe ich einen button und eine Bildansicht. Wenn ich auf die Schaltfläche klicke möchte ich wählte ein Bild aus der Galerie zu speichern. Wenn ich auf die Bildansicht ich will das gespeicherte Bild gezeigt werden.

Thats, was ich versucht habe:

Layout:

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="80dp"
        android:layout_marginRight="80dp"
        android:text="Upload Image"
        android:onClick="onClickUpload"
        android:layout_marginBottom="30dp" />

    <ImageView
        android:id="@+id/imgPicker"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_marginTop="15dp"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp"
        android:onClick="onClickShow"
        app:srcCompat="@android:color/holo_orange_dark" />

Read-Funktion mit und bittet um die Erlaubnis

public void onClickUpload(View view) {

    //request permission to read external storage (explicit necessary since API Level 23)

    //Here, thisActivity is the current activity
    if (ContextCompat.checkSelfPermission(DetailActivity.this,
            Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {

        //Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(DetailActivity.this,
                Manifest.permission.READ_EXTERNAL_STORAGE)) {

            //Show an explanation to the user *asynchronously* -- don't block
            //this thread waiting for the user's response! After the user
            //sees the explanation, try again to request the permission.

        } else {

            //No explanation needed, we can request the permission.

            ActivityCompat.requestPermissions(DetailActivity.this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);

            //MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            //app-defined int constant. The callback method gets the
            //result of the request.
            }
    } else {
        startActivityForResult(new Intent(Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), GET_FROM_GALLERY);
    }
}

Überschreiben onRquestPermissionResult

/*
    find out whether the permission was granted
 */
@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: {
            //If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                //start Activity if granted
                startActivityForResult(new Intent(Intent.ACTION_PICK,
                        MediaStore.Images.Media.INTERNAL_CONTENT_URI), GET_FROM_GALLERY);

            } else {

                //permission denied, boo! Disable the
                //functionality that depends on this permission.
            }
            return;
        }

        //other 'case' lines to check for other
        //permissions this app might request
    }
}

Ausführen nach Erlaubnis:

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

    //Detects request codes
    if(requestCode==GET_FROM_GALLERY && resultCode == Activity.RESULT_OK) {
        Uri selectedImage = data.getData();
        Bitmap bitmap = null;
        try {
            bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage);

            ContextWrapper cw = new ContextWrapper(getApplicationContext());
            //path to /data/data/yourapp/app_data/imageDir
            File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
            //Create imageDir
            File mypath=new File(directory,"profile.jpg");

            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(mypath);
                //Use the compress method on the BitMap object to write image to the OutputStream
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            directory.getAbsolutePath();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

In meinem manifest ich habe auch Berechtigungen:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".activities.LoginActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".activities.RegisterActivity"
        android:screenOrientation="portrait" />
    <activity
        android:name=".activities.CategoryActivity"
        android:screenOrientation="portrait" />
    <activity android:name=".activities.SuggestionActivity" />
    <activity
        android:name=".activities.DetailActivity"
        android:theme="@style/AppTheme" />

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

Trotzdem bekomme ich diese Fehler bei Klick auf die Schaltfläche (Gerät ist API-24):

06-08 19:56:28.903 18770-18782/android.process.media E/DatabaseUtils: Writing exception to parcel
                                                                      java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/file from pid=20240, uid=10046 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
                                                                          at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:608)
                                                                          at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:483)
                                                                          at android.content.ContentProvider$Transport.query(ContentProvider.java:212)
                                                                          at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
                                                                          at android.os.Binder.execTransact(Binder.java:565)
InformationsquelleAutor J Pejic | 2017-06-08



One Reply
  1. 0
    startActivityForResult(new Intent(Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), GET_FROM_GALLERY);

    Den oben genannten code ausgeführt wird, unabhängig von der die Genehmigung erteilt oder nicht. Meinst du, um wickeln Sie es um else für Ihre if?

    public void onClickUpload(View view) {
    
        //Here, thisActivity is the current activity
        if (ContextCompat.checkSelfPermission(DetailActivity.this,
                Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
    
            //Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(DetailActivity.this,
                    Manifest.permission.READ_EXTERNAL_STORAGE)) {
    
                //Show an explanation to the user *asynchronously* -- don't block
                //this thread waiting for the user's response! After the user
                //sees the explanation, try again to request the permission.
    
            } else {
    
                //No explanation needed, we can request the permission.
    
                ActivityCompat.requestPermissions(DetailActivity.this,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                        MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
    
                //MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                //app-defined int constant. The callback method gets the
                //result of the request.
            }
        } else {
            startActivityForResult(new Intent(Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), GET_FROM_GALLERY);
        }
    }

    Und ich nehme an, Sie haben überschrieben

    public void onRequestPermissionsResult(int requestCode,
                                               @NonNull String permissions[],
                                               @NonNull int[] grantResults)

    hören die Erlaubnis erteilt oder nicht.

    • Gut. Ja. Dieser code sollte nur starten, wenn ich die Berechtigung zum Lesen externen Speicher. Das ist wahr. Der code beginnt jedes mal. Bedeutet, dass ich gehen zu der Galerie. Es gibt keine Erlaubnis-dialog, bevor es… nicht der dialog trotzdem starten?
    • Ich denke, Ihre app abstürzt, bevor es versucht, Sie zum befestigen der dialog. damit Sie es nicht sehen.
    • Ich überschreiben onRequestPermissionResult (code Hinzugefügt in der Beschreibung). Nach dem Update mein code, um Ihre version bekomme ich folgenden log: 1611-8222/system_process I/ActivityManager: START u0 {act=android.Inhalt.pm.Aktion.REQUEST_PERMISSIONS pkg= „com“.google.android.packageinstaller cmp=com.google.android.packageinstaller/com.android.packageinstaller.die Genehmigung.ui.GrantPermissionsActivity (has extras)} from uid 10082 auf dem display 0 – aber nichts passiert mehr?
    • Ihre if – block für die Anfrage gewährt werden, ist leer. Wollen Sie nicht starten Sie die Aktivität, wenn die Erlaubnis erteilt wird? Hinzufügen startActivityForResult(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), GET_FROM_GALLERY); zu den if block, wenn es gewährt wird.
    • Das ist ziemlich seltsam. Ich habe die Erlaubnis: wenn (grantResults.Länge > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) …ist wahr, aber ich habe die Erlaubnis bekommen, denial sowieso (code laufen wie aktualisiert in der Beschreibung)
    • Ich verstehe nicht ganz. Auch wenn Sie akzeptieren die Berechtigung, die Tätigkeit ist nicht gestartet? Was passiert dann?
    • Ich bekomme keine dialog-Fenster, aber ich habe gerade versucht einige msg in der wenn (grantResults.Länge > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) wissen, ob wir immer so weit. Wir tun, aber wir bekommen eine Fehlermeldung mit permission denied in log. Ich habe den code ausgeführt, nachdem wir wissen, dass diese Erlaubnis erteilt wurde. Vielleicht ist hier das problem?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.