2

ギャラリーアプリケーションを作成するMediaStoreカーソルクエリを使用して、特定のフォルダの画像をクエリします。Android - READ_EXTERNAL_STORAGE権限が再起動するまで動作しない

Lolipop以上のバージョンの新しいアクセス許可APIに続いて、デバイスのメモリにアクセスする必要があるときに、そのアクセス権が利用可能かどうかを確認します。パーミッションが与えられた後、私はアクティビティを再開し、カーソルは画像エントリ(パーミッションが与えられたことを示す)を返します。

しかし、その後、コードの流れに私はそれらのエントリのビットマップを取得しようと、私はこれを使用してアクセス権のエラーを取得:

Bitmap bm=MediaStore.Images.Thumbnails.getThumbnail(context.getContentResolver(), imageId, MediaStore.Images.Thumbnails.MICRO_KIND, null); 

LogCatは言う:

E/ThumbnailUtils(22666): java.io.FileNotFoundException: /storage/emulated/0/Music/New Folder 2/subfolder/img.jpg: open failed: EACCES (Permission denied) 

私が強制終了した場合アプリケーションを再起動し、System.exit(0)を使用して再起動してください。すべて正常に動作し、ビットマップは正常に取得されます。私は何が起こっているのか理解していない...これはOSのバグですか?任意のヘルプ???

私の許可ロジック:

String permission = Manifest.permission.READ_EXTERNAL_STORAGE; 
if(ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED;){ 
    getImagesFromFolder(folderPath); 
} 
else{ 
    if(ActivityCompat.shouldShowRequestPermissionRationale(athis, permission)){ 
     ActivityCompat.requestPermissions(this, new String[]{permission}, requestCode); 
    } 
    else{ 
     showPermissionProblemDialog(); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    switch(requestCode){ 
    case REQUEST_READ_STORAGE_PERMISSION: 
     finish(); 
     if(grantResults[0]==PackageManager.PERMISSION_GRANTED){ 
      startActivity(getIntent().addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)); 
      overridePendingTransition(0, 0); 
     } 
     else{ 
      F.toastLong(con, "ImageGallery cannot open without the read external storage permission"); 
     } 
     break; 
    } 
} 


public void getImagesFromFolder(String folderPath){ 
    String sortBy=MediaStore.Images.Media.DATE_MODIFIED+" desc"; 
    String selection=MediaStore.Images.Media.DATA +" like?";  
    String[] selectionArgs=new String[]{"%"+folderPath+"%"}; 
    String[] projection = {MediaStore.Images.Media._ID,MediaStore.Images.Media.DATA,MediaStore.Images.Media.DATE_MODIFIED,MediaStore.Images.Media.BUCKET_ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME}; 
    Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
    Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortBy); 
    . 
    . 
    . 
} 
+0

を上書きすることを確認してくださいあなたの許可モデルを示して? – Sibidharan

+0

私は、権限ロジックを含めるようにquesitonを更新しました。しかし、私はそれが何に影響を与えるかは分かりません。その部分はうまくいく。私は許可を得る...問題は、Thumbnailsクラスが、アプリケーションが再起動されるまで私が許可を持っていることを「知っていない」ということです – Anonymous

答えて

0

あなたがギャラリーにアクセスし、ボタンをクリックしたときに、このパーミッションモデルを試してみてください。

 if (ContextCompat.checkSelfPermission(Signup.this, 
        Manifest.permission.READ_EXTERNAL_STORAGE) 
        != PackageManager.PERMISSION_GRANTED) { 
       Log.d("PERMISSIONS", "Manifest.permission.READ_EXTERNAL_STORAGE: Denied"); 
       if (ActivityCompat.shouldShowRequestPermissionRationale(Signup.this, 
         Manifest.permission.READ_EXTERNAL_STORAGE)) { 
        Log.d("PERMISSIONS", "Manifest.permission.READ_EXTERNAL_STORAGE: Requesting with explanation?"); 
        Snackbar.make(v, "Allow accessing your gallery.", Snackbar.LENGTH_INDEFINITE) 
          .setAction("GRANT", new View.OnClickListener() { 
           @Override 
           public void onClick(View v) { 
            ActivityCompat.requestPermissions(Signup.this, 
              new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
              1); 
           } 
          }) 
          .show(); 

       } else { 
        Log.d("PERMISSIONS", "Manifest.permission.READ_EXTERNAL_STORAGE: Requesting implicitly"); 
        ActivityCompat.requestPermissions(Signup.this, 
          new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
          1); 
       } 
      } else { 
       Log.d("PERMISSIONS", "Manifest.permission.READ_EXTERNAL_STORAGE: Granted"); 
       Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       startActivityForResult(i, RESULT_LOAD_IMAGE); 
      } 

onPermissionRequestResult

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case 1: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       Log.d("PERMISSIONS", "Manifest.permission.READ_EXTERNAL_STORAGE: Granted"); 
       Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       startActivityForResult(i, RESULT_LOAD_IMAGE); 

      } else { 

       Toast.makeText(this, "Cannot access gallery. Try again.", Toast.LENGTH_SHORT).show(); 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 
関連する問題