Android 手机拍照适配7.0

本文介绍了如何在Android项目中实现针对7.0系统的相机功能适配,包括在AndroidManifest.xml中的配置,创建file_paths.xml文件以及在Activity中调用相机的代码示例和AppUtils的相关方法。
摘要由CSDN通过智能技术生成

项目中用的知乎的matisse,但是后来有个需求点击直接跳转照相机:

 

在AndroidManifest.xml 中:

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.gswlznkj.crm.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

在res文件夹中建立xml文件夹

在xml文件夹中新建file_paths.xml文件

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path
        name="images"
        path="Android/data/com.example.package.name/files/Pictures/OriPicture/" />
    <external-path
        name="images"
        path="Android/data/com.example.package.name/files/Pictures/OriPicture/" />
    <external-files-path
        name="images"
        path="files/Pictures/OriPicture" />
    <root-path
        name="images"
        path="" />
    <root-path
        name="images"
        path="" />
</paths>

 

activity中的代码

private static final int REQUEST_CODE_CHOOSE = 1001;
private File file;
if(AppUtils.isNeedCreamePermission(SignActivity.this))
    return;
openSysCamera();
/**
 * 打开系统相机
 */
private void openSysCamera() {
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    try {
        file = createOriImageFile();
    } catch (IOException e) {
        e.printStackTrace();
    }

    if (file != null) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            imageUri = Uri.fromFile(file);
        } else {
            imageUri = FileProvider.getUriForFile(this, getPackageName() + ".provider", file);
        }
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(cameraIntent, REQUEST_CODE_CHOOSE);
    }
}


/**
 * 创建原图像保存的文件
 *
 * @return
 * @throws IOException
 */
private File createOriImageFile() throws IOException {
    String imgNameOri =new SimpleDateFormat(
            "yyyyMMdd_HHmmss").format(new Date());
    File pictureDirOri = new File(getExternalFilesDir(
            Environment.DIRECTORY_PICTURES).getAbsolutePath() + "/OriPicture");
    if (!pictureDirOri.exists()) {
        pictureDirOri.mkdirs();
    }
    File image = File.createTempFile(
            imgNameOri,         /* prefix */
            ".jpg",             /* suffix */
            pictureDirOri       /* directory */
    );
    return image;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode ==  REQUEST_CODE_CHOOSE && resultCode == RESULT_OK) {
       
        AppUtils.getPathFromUri(this,imageUri);
       
    }
}

这是AppUtils里的方法

public static boolean isNeedCreamePermission(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        String[] permissionList = new String[]{
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.CAMERA
        };
        PermissionManager permissionManager = PermissionManager.with(activity);
        permissionManager.setNecessaryPermissions(permissionList);
        if (permissionManager.isLackPermission()) {
            permissionManager.requestPermissions();
            return true;
        }
    }
    return false;
}
@SuppressLint("NewApi")
public static String getPathFromUri(Context context,final Uri uri) {
    if (uri == null) {
        return null;
    }
    // 判斷是否為Android 4.4之後的版本
    final boolean after44 = Build.VERSION.SDK_INT >= 19;
    if (after44 && DocumentsContract.isDocumentUri(context, uri)) {
        // 如果是Android 4.4之後的版本,而且屬於文件URI
        final String authority = uri.getAuthority();
        // 判斷Authority是否為本地端檔案所使用的
        if ("com.android.externalstorage.documents".equals(authority)) {
            // 外部儲存空間
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] divide = docId.split(":");
            final String type = divide[0];
            if ("primary".equals(type)) {
                String path = Environment.getExternalStorageDirectory().getAbsolutePath().concat("/").concat(divide[1]);
                return path;
            } else {
                String path = "/storage/".concat(type).concat("/").concat(divide[1]);
                return path;
            }
        } else if ("com.android.providers.downloads.documents".equals(authority)) {
            // 下載目錄
            final String docId = DocumentsContract.getDocumentId(uri);
            if (docId.startsWith("raw:")) {
                final String path = docId.replaceFirst("raw:", "");
                return path;
            }
            final Uri downloadUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.parseLong(docId));
            String path = queryAbsolutePath(context, downloadUri);
            return path;
        } else if ("com.android.providers.media.documents".equals(authority)) {
            // 圖片、影音檔案
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] divide = docId.split(":");
            final String type = divide[0];
            Uri mediaUri = null;
            if ("image".equals(type)) {
                mediaUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            } else if ("video".equals(type)) {
                mediaUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
            } else if ("audio".equals(type)) {
                mediaUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            } else {
                return null;
            }
            mediaUri = ContentUris.withAppendedId(mediaUri, Long.parseLong(divide[1]));
            String path = queryAbsolutePath(context, mediaUri);
            return path;
        }
    } else {
        // 如果是一般的URI
        final String scheme = uri.getScheme();
        String path = null;
        if ("content".equals(scheme)) {
            // 內容URI
            path = queryAbsolutePath(context, uri);
        } else if ("file".equals(scheme)) {
            // 檔案URI
            path = uri.getPath();
        }
        return path;
    }
    return null;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值