6.0及6.0以上权限动态询问

 private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 6; private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE2 = 7; //手机拍照        camera.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (ContextCompat.checkSelfPermission(getApplicationContext(),                        Manifest.permission.CAMERA)                        != PackageManager.PERMISSION_GRANTED) {                    ActivityCompat.requestPermissions(ReviewActivity.this,                            new String[]{Manifest.permission.CAMERA},                            MY_PERMISSIONS_REQUEST_CALL_PHONE);                } else {                    photo();                    dialog.dismiss();                }            }        }); //从相册选择图片        photo.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (ContextCompat.checkSelfPermission(getApplicationContext(),                        Manifest.permission.WRITE_EXTERNAL_STORAGE)                        != PackageManager.PERMISSION_GRANTED) {                    ActivityCompat.requestPermissions(ReviewActivity.this,                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},                            MY_PERMISSIONS_REQUEST_CALL_PHONE2);                } else {                    int selectedMode;                    selectedMode = MultiImageSelectorActivity.MODE_MULTI;                    int maxNum = 9 - drr.size();                    Intent intent = new Intent(ReviewActivity.this,                             MultiImageSelectorActivity.class);                     // 是否显示拍摄图片                    intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, false);                    // 最大可选择图片数量                    intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, maxNum);                    // 选择模式                    intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, selectedMode);                    startActivityForResult(intent, RESULT_LOAD_IMAGE);                    dialog.dismiss();                }            }        }); /**     * 拍照方法代码     */    public void photo() {        try {            if (hasSdcard()) {                String sdcardState = Environment.getExternalStorageState();                String sdcardPathDir = Environment.getExternalStorageDirectory().getPath() + "/tempImage/";                File file = null;                if (Environment.MEDIA_MOUNTED.equals(sdcardState)) {                    // 有sd卡,是否有myImage文件夹                    File fileDir = new File(sdcardPathDir);                    if (!fileDir.exists()) {                        fileDir.mkdirs();                    }                    // 是否有headImg文件                    file = new File(sdcardPathDir + System.currentTimeMillis() + ".JPEG");                }                if (file != null) {                    path = file.getPath();                    photoUri = Uri.fromFile(file);                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {                        //通过FileProvider创建一个content类型的Uri                        photoUri = FileProvider.getUriForFile(ReviewActivity.this, "com.zuihou.drunkenmonkey.fileprovider", file);                    }                    Intent openCameraIntent = new Intent();                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {                        openCameraIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件                    }                    openCameraIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);                    openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);                    startActivityForResult(openCameraIntent, TAKE_PICTURE);                }            } else {                ToastUtil.showToast(getApplicationContext(), "设备没有SD卡!");            }        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 检查设备是否存在SDCard的工具方法     */    public static boolean hasSdcard() {        String state = Environment.getExternalStorageState();        return state.equals(Environment.MEDIA_MOUNTED);    }

这里有一句代码:

FileProvider.getUriForFile(ReviewActivity.this, "com.zuihou.drunkenmonkey.fileprovider", file);

在用Android 7.0版本时,调用相机拍照出现了异常 FileUriExposedException,就是在传递uri时出错 Android 7.0后又修改了文件权限,可以使用FileProvider解决

在项目res目录下创建xml文件夹

<?xml version="1.0" encoding="utf-8"?><paths>            <external-path        name="camera_photos"        path="" />paths>

在manifest.xml文件添加provider,相机,读写文件权限

  <provider            android:name="android.support.v4.content.FileProvider"   //固定值            android:authorities="com.zuihou.drunkenmonkey.fileprovider"  //前面为项目的包名,fileprovider固定            android:exported="false" //是否支持其它应用调用当前组件 ,要求为flase            android:grantUriPermissions="true">              <meta-data                android:name="android.support.FILE_PROVIDER_PATHS" //固定值                android:resource="@xml/file_paths" /> //在res目录下定义的filepaths.xml文件,名字可以自定义        </provider>
    <uses-permission android:name="android.permission.CAMERA"/>    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE">uses-permission>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">uses-permission>

获取权限后返回结果代码

 @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        if (requestCode == MY_PERMISSIONS_REQUEST_CALL_PHONE) {            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {                photo();            } else {                // Permission Denied                ToastUtil.showToast(ReviewActivity.this, "Permission Denied");            }        }        if (requestCode == MY_PERMISSIONS_REQUEST_CALL_PHONE2) {            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {                int selectedMode;                selectedMode = MultiImageSelectorActivity.MODE_MULTI;                int maxNum = 9 - drr.size();                Intent intent = new Intent(ReviewActivity.this, MultiImageSelectorActivity.class);                // 是否显示拍摄图片                intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, false);                // 最大可选择图片数量                intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, maxNum);                // 选择模式                intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, selectedMode);                startActivityForResult(intent, RESULT_LOAD_IMAGE);                dialog.dismiss();            } else {                // Permission Denied                ToastUtil.showToast(ReviewActivity.this, "Permission Denied");            }        }        super.onRequestPermissionsResult(requestCode, permissions, grantResults);    }

更多相关文章

  1. 清除Mac中Android studio的配置文件
  2. Android读取assests目录下文件
  3. android Gallery 仿iPhone 图片滑动
  4. Android 图片裁剪功能实现详解(类似QQ自定义头像裁剪)
  5. android 资源文件
  6. 【android】可放大缩小图片位置点击位置获取
  7. Android将获取到文件的uri转换为字符串的路径

随机推荐

  1. Android(安卓)Phone进程启动过程详解
  2. android 获取本地缓存文件大小,删除功能
  3. Android的服务(Service)(一)生命周期
  4. Android(安卓)AOP实现原理之字节码插桩(一
  5. SpringMVC充当Webservice与android通信
  6. Android权限管理详解
  7. 【Android笔记 二】Location获取地理位置
  8. Android触屏事件传递(个人实践总结)
  9. Android分区介绍及fastboot刷机教程
  10. Android(安卓)自定义UI