No permission for UID to access URI error on Android Application

匿名 (未验证) 提交于 2019-12-03 02:29:01

问题:

I am building a simple app to select an image or take one from camera and crop it. However, it is throwing me this error

java.lang.SecurityException: Uid 10076 does not have permission to uri 0 @ content://com.android.providers.media.documents/document/image%3A66             at android.os.Parcel.readException(Parcel.java:1546)             at android.os.Parcel.readException(Parcel.java:1499)             at android.app.ActivityManagerProxy.grantUriPermission(ActivityManagerNative.java:3948)             at android.app.ContextImpl.grantUriPermission(ContextImpl.java:1961)             at android.content.ContextWrapper.grantUriPermission(ContextWrapper.java:605)             at err.a(Unknown Source)             at eru.a(Unknown Source)             at dwt.b(Unknown Source)             at dwv.a(Unknown Source)             at dwv.b(Unknown Source)             at dwv.a(Unknown Source)             at dxm.a(Unknown Source)             at erq.a(Unknown Source)             at fpb.handleMessage(PG:141)             at android.os.Handler.dispatchMessage(Handler.java:98)             at android.os.Looper.loop(Looper.java:135)             at android.os.HandlerThread.run(HandlerThread.java:61) 

The code for My Main Activity is

package campusconnect.cc.volleyandimage;  import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ResolveInfo; import android.graphics.Bitmap; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import java.io.File; import java.util.ArrayList; import java.util.List;  public class MainActivity extends AppCompatActivity {     private Uri mImageCaptureUri;     private ImageView mImageView;      private static final int PICK_FROM_CAMERA = 1;     private static final int CROP_FROM_CAMERA = 2;     private static final int PICK_FROM_FILE = 3;      @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          final String [] items             = new String [] {"Take from camera", "Select from gallery"};         ArrayAdapter<String> adapter      = new ArrayAdapter<String> (this, android.R.layout.select_dialog_item,items);         AlertDialog.Builder builder       = new AlertDialog.Builder(this);          builder.setTitle("Select Image");         builder.setAdapter( adapter, new DialogInterface.OnClickListener() {             public void onClick( DialogInterface dialog, int item ) { //pick from camera                 if (item == 0) {                     Intent intent    = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);                      mImageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),                             "tmp_avatar_" + String.valueOf(System.currentTimeMillis()) + ".jpg"));                      intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri);                      try {                         intent.putExtra("return-data", true);                          startActivityForResult(intent, PICK_FROM_CAMERA);                     } catch (ActivityNotFoundException e) {                         e.printStackTrace();                     }                 } else { //pick from file                     Intent intent = new Intent();                      intent.setType("image/*");                     intent.setAction(Intent.ACTION_GET_CONTENT);                      startActivityForResult(Intent.createChooser(intent, "Complete action using"), PICK_FROM_FILE);                 }             }         } );          final AlertDialog dialog = builder.create();          Button button   = (Button) findViewById(R.id.btn_crop);         mImageView            = (ImageView) findViewById(R.id.iv_photo);          button.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                 dialog.show();             }         });     }      @Override     protected void onActivityResult(int requestCode, int resultCode, Intent data) {         if (resultCode != RESULT_OK) return;          switch (requestCode) {             case PICK_FROM_CAMERA:                 doCrop();                  break;              case PICK_FROM_FILE:                 mImageCaptureUri = data.getData();                  doCrop();                  break;              case CROP_FROM_CAMERA:                 Bundle extras = data.getExtras();                  if (extras != null) {                     Bitmap photo = extras.getParcelable("data");                      mImageView.setImageBitmap(photo);                 }                  File f = new File(mImageCaptureUri.getPath());                  if (f.exists()) f.delete();                  break;          }     }      private void doCrop() {         final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();          Intent intent = new Intent("com.android.camera.action.CROP");         intent.setType("image/*");          List<ResolveInfo> list = getPackageManager().queryIntentActivities( intent, 0 );          int size = list.size();          if (size == 0) {             Toast.makeText(this, "Can not find image crop app", Toast.LENGTH_SHORT).show();              return;         } else {             intent.setData(mImageCaptureUri);              intent.putExtra("outputX", 200);             intent.putExtra("outputY", 200);             intent.putExtra("aspectX", 1);             intent.putExtra("aspectY", 1);             intent.putExtra("scale", true);             intent.putExtra("return-data", true);              if (size == 1) {                 Intent i            = new Intent(intent);                 ResolveInfo res     = list.get(0);                  i.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));                  startActivityForResult(i, CROP_FROM_CAMERA);             } else {                 for (ResolveInfo res : list) {                     final CropOption co = new CropOption();                      co.title  = getPackageManager().getApplicationLabel(res.activityInfo.applicationInfo);                     co.icon         = getPackageManager().getApplicationIcon(res.activityInfo.applicationInfo);                     co.appIntent= new Intent(intent);                      co.appIntent.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));                      cropOptions.add(co);                 }                  CropOptionAdapter adapter = new CropOptionAdapter(getApplicationContext(), cropOptions);                  AlertDialog.Builder builder = new AlertDialog.Builder(this);                 builder.setTitle("Choose Crop App");                 builder.setAdapter( adapter, new DialogInterface.OnClickListener() {                     public void onClick( DialogInterface dialog, int item ) {                         startActivityForResult( cropOptions.get(item).appIntent, CROP_FROM_CAMERA);                     }                 });                  builder.setOnCancelListener( new DialogInterface.OnCancelListener() {                     @Override                     public void onCancel( DialogInterface dialog ) {                          if (mImageCaptureUri != null ) {                             getContentResolver().delete(mImageCaptureUri, null, null );                             mImageCaptureUri = null;                         }                     }                 } );                  AlertDialog alert = builder.create();                  alert.show();             }         }     } } 

Permissions set for the app are

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />     <uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>     <uses-permission android:name="android.permission.INTERNET" />     <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 

I thot that I had given all the permissions necessary to access.. Am I missing something?

回答1:

Try this out:

Android Manifest:

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

Get image by URI

i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, CHOOSE_IMAGE); 

This forces the older gallery to open.

Now you can get the result on your onActivityResult with:

Uri selectedImageURI = data.getData(); 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!