简体   繁体   English

android:致命异常:java.lang.SecurityException:权限拒绝:启动意图{act = android.media.action.IMAGE_CAPTURE

[英]android: FATAL EXCEPTION: java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE

I have tried everything I could find by researching. 我尝试了所有可以通过研究找到的东西。 Nothing is working. 什么都没用。 I have an Activity with a FragmentDialog. 我有一个带有FragmentDialog的活动。 In this dialog, I have an image view with a button. 在此对话框中,我有一个带有按钮的图像视图。 When this button is pressed, an alert pops up to take pic, choose pic from gallery or cancel. 按下此按钮时,会弹出警报以拍摄照片,从图库中选择照片或取消。 Both the cancel and the gallery buttons work great, but when I try to take a photo, I get the error message in the title: “取消”和“图库”按钮都很好用,但是当我尝试拍照时,标题中出现错误信息:

FATAL EXCEPTION: java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE cmp=com.lge.camera/.app.CameraActivity } from ProcessRecord{c6d8bdf 7649:com.devhopes.ryde/u0a152} (pid=7649, uid=10152) with revoked permission android.permission.CAMERA 致命异常:java.lang.SecurityException:权限拒绝:启动Intent {act = android.media.action.IMAGE_CAPTURE cmp = com.lge.camera / .app.CameraActivity} from ProcessRecord {c6d8bdf 7649:com.devhopes.ryde / u0a152 }(pid = 7649,uid = 10152),其权限已撤销android.permission.CAMERA

Below is my DialogFragment and Manifest Code: 以下是我的DialogFragment和清单代码:

UsernameDialogFragment 用户名对话框片段

   public static class UsernameDialogFragment extends DialogFragment {

    Context applicationContext = bDriverRegistrationActivity.getContextOfApplication();

    private ImageView profilePic;
    private int REQUEST_CAMERA = 0, SELECT_FILE = 1;
    private Button btnSelect;
    private String userChosenTask;

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case Utility.MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    if(userChosenTask.equals("Take Photo"))
                        cameraIntent();
                    else if(userChosenTask.equals("Choose from Library"))
                        galleryIntent();
                } else {
                    //code for deny
                }
                break;
        }
    }


    private void galleryIntent() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);//
        startActivityForResult(Intent.createChooser(intent, "Select File"),SELECT_FILE);
    }


    private void cameraIntent() {
        Intent intent = new Intent(ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, REQUEST_CAMERA);
    }


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

        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == SELECT_FILE)
                onSelectFromGalleryResult(data);
            else if (requestCode == REQUEST_CAMERA)
                onCaptureImageResult(data);
        }
    }


    private void onCaptureImageResult(Intent data) {
        Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bytes);

        File destination = new File(Environment.getExternalStorageDirectory(),
                System.currentTimeMillis() + ".jpg");

        FileOutputStream fo;
        try {
            destination.createNewFile();
            fo = new FileOutputStream(destination);
            fo.write(bytes.toByteArray());
            fo.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        profilePic.setImageBitmap(thumbnail);
    }


    @SuppressWarnings("deprecation")
    private void onSelectFromGalleryResult(Intent data) {

        Bitmap bm=null;
        if (data != null) {
            try {
                bm = MediaStore.Images.Media.getBitmap(contextOfApplication
                        .getContentResolver(), data.getData());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        profilePic.setImageBitmap(bm);
    }


    private void selectImage() {
        final CharSequence[] items = { "Take Photo", "Choose from Library",
                "Cancel" };

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Add Photo!");
        builder.setItems(items, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int item) {
                boolean result=Utility.checkPermission(getActivity());

                if (items[item].equals("Take Photo")) {
                    userChosenTask ="Take Photo";
                    if(result) {
                        cameraIntent();
                    }

                } else if (items[item].equals("Choose from Library")) {
                    userChosenTask ="Choose from Library";
                    if(result) {
                        galleryIntent();
                    }

                } else if (items[item].equals("Cancel")) {
                    dialog.dismiss();
                }
            }
        });
        builder.show();
    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        super.onCreateDialog(savedInstanceState);

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        // Get the layout inflater
        LayoutInflater inflater = getActivity().getLayoutInflater();

        View dialogView = inflater.inflate(R.layout.username_dialog, null);

        // Select button
        btnSelect = (dialogView).findViewById(R.id.btnSelectPhoto);
        btnSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                selectImage();
            }
        });

        // profile pic
        profilePic = dialogView.findViewById(R.id.profile_pic);

        // Inflate and set the layout for the dialog
        // Pass null as the parent view because its going in the dialog layout
        builder.setView(dialogView);

       // ... Add action buttons ...

        builder.setPositiveButton(R.string.action_register, new DialogInterface.OnClickListener() {
            @Override
            public final void onClick(final DialogInterface dialog, int id) {
                // save the username to Firebase and sign in user  ...

                // ... casting dialog interface to an alert dialog and casting
                // the result of the findView to an EditText
                EditText usernameField  = (EditText)((AlertDialog) dialog).findViewById(username);
                String username = usernameField.getText().toString();

                // year
                EditText yearField = (EditText)((AlertDialog) dialog).findViewById(R.id.year);
                String year = yearField.getText().toString();

                // color, make and model
                EditText cmmField = (EditText)((AlertDialog) dialog).findViewById(R.id.cmm);
                String cmm = cmmField.getText().toString();

                // cell
                EditText cellField = (EditText)((AlertDialog) dialog).findViewById(R.id.cell);
                String cell = cellField.getText().toString();

                // license plate no.
                EditText plateField = (EditText)((AlertDialog) dialog).findViewById(R.id.licenseNo);
                String licenseNo = plateField.getText().toString();

                // profic pic
                ImageView profil_pic = (ImageView)((AlertDialog) dialog).findViewById(R.id.profile_pic);
                // TODO:  set up profile pic to save to firebase

                // ... get user's unique id
                String userId = FirebaseAuth.getInstance().getCurrentUser().getUid();

                User aUser = new User(username, year, cmm, cell, licenseNo);


                /*  https://android-chat-af94c.firebaseio.com/android-chat-af94c/
                    users/pRsxsToJZPTzCdtft69f1grIJC13/profile/username

                    getInstance -> grabbing the url:
                    https://android-chat-af94c.firebaseio.com/android-chat-af94c/
                */
                // above is the same as below ...
                FirebaseDatabase.getInstance().getReference("drivers").child(userId).setValue(aUser);

                Intent intent = new Intent(getActivity().getBaseContext(), PoliciesActivity.class);
                startActivity(intent);
            }

        });

        return builder.create();

    }

}  // UsernameDialogFragment

AndroidManifest permissions AndroidManifest权限

    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

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

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

<uses-permission android:name="android.permission.CAMERA"
    android:requiredFeature="true"/>
<uses-permission android:name="android.permission.STORAGE"/>

<!--
     The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
     Google Maps Android API v2, but you must specify either coarse or fine
     location permissions for the 'MyLocation' functionality. 
-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

In the Android Monitor, it seems to point at 3 lines in particular: 在Android Monitor中,它似乎特别指向3行:

  • startActivityForResult(intent, REQUEST_CAMERA); startActivityForResult(intent,REQUEST_CAMERA);
  • public static class UsernameDialogFragment extends DialogFragment { 公共静态类UsernameDialogFragment扩展DialogFragment {
  • cameraIntent(); cameraIntent();

If you are testing your app with Android 6.x or 7.x version you need to grant some permission (Location,camera etc..) at run time.You can find how to achieve this in here. 如果您正在使用Android 6.x或7.x版本测试您的应用,则需要在运行时授予一些权限(位置,相机等)。您可以在此处找到如何实现此目的。 https://developer.android.com/training/permissions/requesting.html https://developer.android.com/training/permissions/requesting.html

If you are targeting API Level 23 or more, then you should force get permissions like below(contains several permissions, you can add or remove based on your requirement). 如果您的目标是API Level 23或更高级别,则应强制获得如下所示的权限(包含多个权限,您可以根据需要添加或删除)。 Put this in a separate class: 将其放在单独的类中:

public static List<String> checkAndRequestPermissions(Context context) {

    int camera = ContextCompat.checkSelfPermission(context, android.Manifest.permission.CAMERA);
    int readStorage = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);
    int writeStorage = ContextCompat.checkSelfPermission(context, android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
    int fineLoc = ContextCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION);
    int coarseLoc = ContextCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION);
    List<String> listPermissionsNeeded = new ArrayList<>();

    if (camera != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.CAMERA);
    }
    if (readStorage != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.READ_EXTERNAL_STORAGE);
    }
    if (writeStorage != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
    }
    if (fineLoc != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.ACCESS_FINE_LOCATION);
    }
    if (coarseLoc != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(android.Manifest.permission.ACCESS_COARSE_LOCATION);
    }

    return listPermissionsNeeded;
}

And in your activity: 在您的活动中:

public static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1;  // Declare this integer globally

Add this method(to retrieve permissions): 添加此方法(以检索权限):

private boolean permissions(List<String> listPermissionsNeeded) {

    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray
                (new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
        return false;
    }
    return true;
}

And force get permissions like this: 并强制获得这样的权限:

// In my case I've put the 'checkAndRequestPermissions' method in a separate class named 'PermissionUtils'
List<String> permissionList = PermissionUtils.checkAndRequestPermissions(this);  

     if (permissions(permissionList)) {

          dispatchTakePictureIntent();  // call your camera instead of this method
     }

Request the permissions you need at runtime. 在运行时请求所需的权限。 Code is from here so check it out 代码来自这里 ,请检查一下

if (ContextCompat.checkSelfPermission(thisActivity,
            Manifest.permission.READ_CONTACTS)
    != PackageManager.PERMISSION_GRANTED) {

// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
        Manifest.permission.READ_CONTACTS)) {

    // 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(thisActivity,
            new String[]{Manifest.permission.READ_CONTACTS},
            MY_PERMISSIONS_REQUEST_READ_CONTACTS);

    // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
    // app-defined int constant. The callback method gets the
    // result of the request.
}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 java.lang.SecurityException:权限被拒绝:启动 Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] - java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] ActivityManager:java.lang.SecurityException:权限拒绝:启动Intent {act = android.intent.act - ActivityManager: java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.act java.lang.SecurityException:权限拒绝:启动意图{act = android.settings.USAGE_ACCESS_SETTINGS} - java.lang.SecurityException: Permission Denial: starting Intent {act=android.settings.USAGE_ACCESS_SETTINGS} Android - java.lang.SecurityException:权限拒绝:启动 Intent - Android - java.lang.SecurityException: Permission Denial: starting Intent java.lang.SecurityException:权限拒绝:以IMAGE_CAPTURE开头的Intent - java.lang.SecurityException: Permission Denial: starting Intent with IMAGE_CAPTURE Android:java.lang.SecurityException:权限拒绝:启动意图 - Android: java.lang.SecurityException: Permission Denial: start Intent java.lang.SecurityException:权限拒绝:不允许仅在 KitKat 上发送广播 android.intent.action.MEDIA_MOUNTED - java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED on KitKat only “java.lang.SecurityException:权限拒绝:启动意图”在Android上发送电子邮件 - “java.lang.SecurityException: Permission Denial: starting Intent” sending an email on Android java.lang.SecurityException:权限拒绝:启动Intent com.android.calendar / .DayActivity - java.lang.SecurityException: Permission Denial: starting Intent com.android.calendar/.DayActivity CSipSimple-java.lang.SecurityException:权限拒绝:不允许发送广播android.intent.action.Phone_State - CSipSimple - java.lang.SecurityException : Permission Denial: not allowed to send broadcast android.intent.action.Phone_State
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM