2016-06-07 19 views
3

Ich versuche, das Bild aus der Galerie auswählen, aber meine Anwendung bekommt Ausnahme von 'Etwas ging falsche Nachricht . Ich dachte, dass ich die androide Berechtigung WRITE_EXTERNAL_STORAGE und READ_EXTERNAL_STORAGE richtig einrichte, aber ich bekomme immer Fehler. Was soll ich tun, damit es funktioniert?java.lang.SecurityException: Permission Denial: Lesen von com.android.providers.media.MediaProvider in Android während der Aufnahme aus der Galerie

Hier ist meine Log Katze Fehler

06-07 12:07:27.567 1692-1711/? E/DatabaseUtils﹕ Writing exception to parcel 
    java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media/359 from pid=2818, uid=10057 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() 
      at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:605) 
      at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:480) 
      at android.content.ContentProvider$Transport.query(ContentProvider.java:211) 
      at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112) 
      at android.os.Binder.execTransact(Binder.java:453) 

Hier meine Aktivität Code ist

public class MainActivity extends Activity { 
    private static int RESULT_LOAD_IMG = 1; 
    String imgDecodableString; 

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

    public void loadImagefromGallery(View view) { 
     // Create intent to Open Image applications like Gallery, Google Photos 
     Intent galleryIntent = new Intent(Intent.ACTION_PICK, 
       android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
     // Start the Intent 
     startActivityForResult(galleryIntent, RESULT_LOAD_IMG); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     try { 
      // When an Image is picked 
      if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK 
        && null != data) { 
       // Get the Image from data 

       Uri selectedImage = data.getData(); 
       String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

       // Get the cursor 
       Cursor cursor = getContentResolver().query(selectedImage, 
         filePathColumn, null, null, null); 
       // Move to first row 
       cursor.moveToFirst(); 

       int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
       imgDecodableString = cursor.getString(columnIndex); 
       cursor.close(); 
       ImageView imgView = (ImageView) findViewById(R.id.imgView); 
       // Set the Image in ImageView after decoding the String 
       imgView.setImageBitmap(BitmapFactory 
         .decodeFile(imgDecodableString)); 

      } else { 
       Toast.makeText(this, "You haven't picked Image", 
         Toast.LENGTH_LONG).show(); 
      } 
     } catch (Exception e) { 
      Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG) 
        .show(); 
     } 
    } 
} 

Hier meine Menifest.xml Datei Code

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.tazeen.image_fromgallery" > 

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

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

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
+0

auf welcher Android-Version testen Sie den Code? Wenn Sie auf Android m oder höher testen dann beziehen Sie sich hier, um Laufzeitberechtigungen einzurichten http://coderzpassion.com/android-new-runtime-permissions/ –

+0

Danke für die Antwort. Ich teste den Code in minsdkversion 15 und targetSdkVersion ist 23 und compileSdkVersion 23 buildToolsVersion "23.0.2" – androidTag

+0

ändern Sie Ihr Ziel auf 22 oder schreiben Sie Code für die Laufzeitberechtigung –

Antwort

5

Für die manuelle Berechtigungen für API-Ebene 23 Überprüfung und oben i diesen Code verwenden.

public static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 123; 

public boolean checkPermissionREAD_EXTERNAL_STORAGE(
      final Context context) { 
     int currentAPIVersion = Build.VERSION.SDK_INT; 
     if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) { 
      if (ContextCompat.checkSelfPermission(context, 
        Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
       if (ActivityCompat.shouldShowRequestPermissionRationale(
         (Activity) context, 
         Manifest.permission.READ_EXTERNAL_STORAGE)) { 
        showDialog("External storage", context, 
          Manifest.permission.READ_EXTERNAL_STORAGE); 

       } else { 
        ActivityCompat 
          .requestPermissions(
            (Activity) context, 
            new String[] { Manifest.permission.READ_EXTERNAL_STORAGE }, 
            MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); 
       } 
       return false; 
      } else { 
       return true; 
      } 

     } else { 
      return true; 
     } 
    } 

showdialog()

public void showDialog(final String msg, final Context context, 
      final String permission) { 
     AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context); 
     alertBuilder.setCancelable(true); 
     alertBuilder.setTitle("Permission necessary"); 
     alertBuilder.setMessage(msg + " permission is necessary"); 
     alertBuilder.setPositiveButton(android.R.string.yes, 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         ActivityCompat.requestPermissions((Activity) context, 
           new String[] { permission }, 
           MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); 
        } 
       }); 
     AlertDialog alert = alertBuilder.create(); 
     alert.show(); 
    } 

in Ihrer Tätigkeit Prüfung wie diese.

if (checkPermissionREAD_EXTERNAL_STORAGE(this)) { 
      // do your stuff.. 
     } 

Und vergessen Sie nicht, onRequestPermissionsResult hinzuzufügen.

@Override 
    public void onRequestPermissionsResult(int requestCode, 
      String[] permissions, int[] grantResults) { 
     switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       // do your stuff 
      } else { 
       Toast.makeText(Login.this, "GET_ACCOUNTS Denied", 
         Toast.LENGTH_SHORT).show(); 
      } 
      break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, 
        grantResults); 
     } 
    } 

Glücklich Coding ..

+0

Können Sie mir bitte in diesem Zustand Methodenaufruf sagen, die, wenn sie (checkPermissionREAD_EXTERNAL_STORAGE (this)) {// Ihre Sachen tun .. } – androidTag

+0

meine Antwort prüfe ich, dass (checkPermissionREAD_EXTERNAL_STORAGE) -Methode alread gebucht haben. Sie müssen diese Methode nur in Ihre Klasse kopieren, in der Sie dies überprüfen. –

+0

Vielen Dank. Es funktioniert großartig. Ich habe so viele Tage damit verbracht, dieses Problem zu lösen. Endlich lösen Sie es. Ich danke dir sehr. – androidTag

3

Sie haben zwei Lösungen für Ihre Problem. Der schnellste ist, targetApi auf 22 zu reduzieren (build.gradle file). Als zweites muss das neue runtimePermission-Modell verwendet werden: Da Ihre Ziel-API 23 ist, sollten Sie die Berechtigungen auch zur Laufzeit hinzufügen.

if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) 
     != PackageManager.READ_EXTERNAL_STORAGE) { 

    // Should we show an explanation? 
    if (shouldShowRequestPermissionRationale(
      Manifest.permission.READ_EXTERNAL_STORAGE)) { 
     // Explain to the user why we need to read the contacts 
    } 

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

    // MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE is an 
    // app-defined int constant 

    return; 
} 

Sniplet finden Sie hier: https://developer.android.com/training/permissions/requesting.html

+0

Kann ich diesen Code in onCreate() und Was sollte ich an Stelle von MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE schreiben – androidTag

+0

MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE ist konstant Sie können irgendwelche Werte dafür geben. Wenn Sie planen, das runTimePermission Modell zu tun, lesen Sie besser zuerst die Dokumente .. Docs haben auch mit Beispielen zur Verfügung gestellt .. https://developer.android.com/training/permissions/request.html.html –

+0

Aber wo ich diesen Code. – androidTag

0

Sie müssen alle Pakete Berechtigungen explizit setzen Ihre Absicht entsprechen. Sie können dieses Dienstprogramm verwenden, um das zu tun:

List<ResolveInfo> resInfoList = getContext().getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
    for (ResolveInfo resolveInfo : resInfoList) { 
     String packageName = resolveInfo.activityInfo.packageName; 
     getContext().grantUriPermission(packageName, imageFileUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    } 
Verwandte Themen