当前位置: 首页 > 知识库问答 >
问题:

Android:致命例外:java.lang.安全异常:权限拒绝:启动意图{act=android.media.action.IMAGE_CAPTURE

东方华晖
2023-03-14

我已经尝试了通过研究所能找到的一切。什么都没用。我有一个带有片段对话的活动。在这个对话框中,我有一个带有按钮的图像视图。按下此按钮时,会弹出一个警报,提示拍摄照片、从gallery中选择照片或取消。“取消”和“多媒体资料”按钮都很有效,但当我尝试拍照时,我会在标题中看到错误消息:

致命的例外:java。lang.SecurityException:权限拒绝:从ProcessRecord{c6d8bdf 7649:com.devhopes.ryde/u0a152}(pid=7649,uid=10152)启动意图{act=android.media.action.IMAGE_CAPTURE cmp=com.lge.camera/.app.CameraActivity},并撤销android的权限。准许照相机

下面是我的对话框和清单代码:

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权限

    <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" />

在Android显示器中,它似乎特别指向三行:

  • startActivityForResult(意图、请求和摄像头)
  • 公共静态类UsernameDialogFragment扩展了DialogFragment{
  • cameraIntent()

共有3个答案

拓拔辰钊
2023-03-14

请求运行时所需的权限。代码来自这里,请查看

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.
}
}
左丘宜然
2023-03-14

如果你正在用Android 6测试你的应用程序。x或7。x版本您需要授予一些权限(位置、摄像头等)在运行时。你可以在这里找到如何实现这一点。https://developer.android.com/training/permissions/requesting.html

叶智
2023-03-14

如果您的目标是API Level 23或更多,那么您应该强制获取如下权限(包含多个权限,您可以根据您的要求添加或删除)。将其放在单独的类中:

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;
}

在你的活动中:

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

添加此方法(检索权限):

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;
}

强制获取如下权限:

// 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
     }
 类似资料:
  • 问题内容: 尝试使用意图时收到java.lang.SecurityException 。有趣的是,此崩溃仅在装有Android 5.1-5.1.1的华为上发生我没有华为设备。您能给我一些建议吗? 堆栈跟踪 问题答案: 无论出于何种原因,华为都将其保留在原处,但他们将其标记为未导出。您无法启动该活动。您所能做的就是捕获异常,并向用户说明您无法在此处导航。

  • logcat给我这个错误: 当我将应用程序从eclipse部署到emulator时,它工作正常。当我关闭应用程序并尝试再次运行时,出现问题,然后我收到消息: 这是我的舱单。xml 有人能检查一下出了什么问题吗? 谢谢

  • 我正在尝试使用相机并保存图像。按照Commonware建议的步骤进行操作。我经常出错- 2018-11-12 02:10:54.588 3145-3173/inder.execE/Database aseUtils:写入异常到包裹inder.java:682安全异常:权限拒绝:写入android.support.v4.content.FileProvider uricontent://com.bi

  • 我在项目的构建路径上有一个库(jar)。项目使用以下意图访问jar中的主要活动: 它曾经工作了一段时间,但突然开始得到“ActivityNotFoundExcema:没有发现处理意图的活动”,我能够解决这个问题。但是现在我被一个java.lang.安全异常:权限拒绝:开始意图卡住了。 我已经尝试了stackoverflow上提出的所有建议(检查清单文件中的重复项;添加android:导出="tru

  • 这个错误真的很奇怪,我不知道如何重现它,也不知道如何修复它,因为我做了很多搜索,但没有什么有用的。 这是stacktrace: 这是我的AndroidManifest。xml 请不要费心问我是否在我的清单中有正确的INTERNET权限,因为这个应用程序已经上市2年了:P 我还注意到(来自Crittercism)所有错误都来自Android 4.1. x版本(JB)。我不知道设备是否已root或什么

  • 我越来越- 在 我已经检查了这个帖子,但无法解决它。我该如何解决这个问题?