java - Android 运行时权限(权限被拒绝)

标签 java android permissions camera runtime

我已将使用权限(包括 WRITE_EXTERNAL_STORAGE、android.permission.CAMERA、READ_EXTERNAL_STORAGE)添加到 AndroidManifest.xml。

当我在 Nexus6(API 24)中运行我的应用程序时,它引发了以下错误:

java.io.IOException: Permission denied

这是我的代码:

/**
 * A simple {@link Fragment} subclass.
 */
public class HomeProfileFragment extends Fragment {

    public static final int REQUEST_IMAGE_CAPTURE = 1;

    private String imageFilePath;

    public HomeProfileFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_home_profile, container, false);
        ///#################
        String[] perms = {"android.permission.RECORD_AUDIO", "android.permission.CAMERA"};

        File imageFile = null;
        try{
            String state = Environment.getExternalStorageState();
            if (Environment.MEDIA_MOUNTED.equals(state)) {
                imageFile = createImageFile();
                imageFilePath = imageFile.getAbsolutePath();
            } else {
                /// Throw an error
            }
        }catch (IOException e){
            e.printStackTrace();
        }

        int permsRequestCode = 200;

        requestPermissions(perms, permsRequestCode);
        ///#################


        if (imageFile != null){
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile));

            if(takePictureIntent.resolveActivity(getActivity().getPackageManager())!=null){
                startActivityForResult(takePictureIntent,REQUEST_IMAGE_CAPTURE);

            }
        }
        return view;
    }

    ///##################
    public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){

        switch(permsRequestCode){

            case 200:

                boolean audioAccepted = grantResults[0]== PackageManager.PERMISSION_GRANTED;

                boolean cameraAccepted = grantResults[1]==PackageManager.PERMISSION_GRANTED;

                break;

        }

    }

    ///##################

    private File createImageFile()throws IOException {
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String fileName = "JPEG_" + timeStamp + "_";

        File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

        File image = File.createTempFile(fileName, ".jpg", storageDir);
        return image;

    }


    private void addPhotoToGallery(String filepath){
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        File f = new File(filepath);
        Uri uri =Uri.fromFile(f);
        mediaScanIntent.setData(uri);

        getActivity().sendBroadcast(mediaScanIntent);

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == Activity.RESULT_CANCELED){
        } if (requestCode == Activity.RESULT_CANCELED){
            addPhotoToGallery(imageFilePath);
        }
    }
    ///#################################
    private boolean shouldAskPermission(){

        return(Build.VERSION.SDK_INT> Build.VERSION_CODES.LOLLIPOP_MR1);

    }
}

如何在打开之前使用权限相机运行时?

最佳答案

您必须在 list 中声明用户权限

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

它必须位于 list 中,以便安装程序可以要求用户向应用授予这些权限。

关于java - Android 运行时权限(权限被拒绝),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41920511/

相关文章:

Java——最高效的匹配方法

java - 串行硬件设备的消息传递解决方案

java - 使用倒数计时器以特定时间间隔发出信号

android - 使用 Intent 调用电话时需要权限吗?

Linux更改组权限以匹配所有者权限

java - 如何将集合转换为按嵌套集合属性的元素分组的 Guava Multimap?

java - 为什么这段代码中永远不会抛出 IOException

android - NativeScript ListView 元素模板

android - glDrawTexfOES 在手机上绘制黑色纹理,并在模拟器中正确

git - 如何启用我的 Azure 管道以使用 Git checkout 子模块?