安卓7.0打开相机(权限与内容提供器)

本文大部分来自第二行代码,只是部分权限问题改动与说明
其中主要问题就是安卓6.0权限问题和7.0url问题。

  1. 首先需要设置权限
    <!-- 摄像头 -->
    <uses-permission android:name="android.permission.CAMERA" />
    <!-- 获取sd卡写的权限,用于文件上传和下载 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    这是使用照相机和可以修改内存的权限

    2.然后是关于file的uri
    安卓7.0要求,禁止暴露file的uri,否则会报错FileUriExposeException错误,必须使用fileProvider把uri封装再传给外部。配置如下
    ① 设置在<manifest>里设置

  <application
<provider          android:name="android.support.v4.content.FileProvider"         android:authorities="com.example.mbmob.fileprovider"
 <!--此处的authorities可以设置任意值,但是不同应用间必须不同,否则会因为数据库重复无法安装 -->
android:exported="false"
<!--必须为false ,意思是不可被分享,这是fileprovide要求-->
android:grantUriPermissions="true">
<meta-data            android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
<!--meta指定uri的共享路径,并且引用了一个叫@xml/file_paths资源-->
</provider>
</application>  
②接下来在右击res,new————directory,创建xml目录,然后生成file_paths,内容复制如下
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path  name ="my_images"  path=""/>
    <!--name名字任意,paths为空说明整个sd卡可共享(可能红色报错,不用管)-->
</paths>

3拍照的相关代码

首先检测权限,照相的权限和访问内存卡的权限

if((ContextCompat.checkSelfPermission(getActivity().getBaseContex(),Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED)||ContextCompat.checkSelfPermission(getActivity().getBaseContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) !=PackageManager.PERMISSION_GRANTED)) {
                        //如果没有授权,则请求授权
       ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1311);
       //String数组中为申请的权限,第一个是相机,第二个为修改内存,最后的参数即为申请授权的返回值,我设置的1311
、、
                    } else {
                        zhaoxiang();
                        }
   public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {  
           case 1311:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                zhaoxiang();
            } else {
                Toast.makeText(getContext(),"没有权限打开相机",Toast.LENGTH_SHORT).show();
            }
            break;
        default:
    }
}`
          public void zhaoxiang() {
    Calendar c = Calendar.getInstance();
    int year = c.get(Calendar.YEAR);
    int month = c.get(Calendar.MONTH);
    int day = c.get(Calendar.DAY_OF_MONTH);    headImage = new File(Environment.getExternalStorageDirectory() + "/mbmob/", year + "-" + month + "-" + day + i.getName() + "head.jpg");

    //创建一个file,第一个指数路径,第二个为图片名字  其中,路径为sd卡中一个名为mbmob的文件下,headImage是我提前声明的一个空file
    //如果不加/mbob/这句,就是获得手机里一个专门放置应用缓存的地方  get那个方法就是获取这个位置
    try {
        if (headImage.exists()) {
            headImage.delete();
        }
        headImage.createNewFile();
        //如果原来就有这个文件  删除
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (Build.VERSION.SDK_INT >= 24) {
        //判断安卓版本 高于7.0
        imageUri = FileProvider.getUriForFile(getActivity(), "com.example.mbmob.fileprovider", headImage);
        // 第一个是content ,第二个即为在provider里是设置的author那个,第三个是File对象
    } else {
        //低于7.0
        imageUri = Uri.fromFile(headImage);
        //获取图片路径
    }

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    //指定图片的输出地址
    startActivityForResult(intent, TAKE_PHOTO);
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {

    switch (requestCode) {
        case TAKE_PHOTO:
            //照相结束后就会返回,此时调用这个
            if (resultCode == RESULT_OK) {


               此时获得的headimage就是保存了图片的,这里如何利用自己定义

            }
            break;
        default:
            break;
    }

}

“`

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章