Android-拍照上传图片

Android手机拍照获取图片资源的处理,Android 7之后发生了一些变化,以下是个人将拍照上传流程进行整理

第一步:配置mainfest, 添加provider(在application标签内)

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileProvider"
    android:exported="false"
    android:grantUriPermissions="true">//表示授予URI临时访问权限
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths" />
</provider>

第二步:在资源文件中配置上述provider中引用的provider_paths.xml文件,文件内容如下

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path path="Android/data/${applicationId}/"  name="files_root" />
    //path: 需要临时访问的路径(.代表所有路径)  name:给访问路径命名
    <external-path path="." name="external_storage_root" />
</paths>

第三步:Activity中的调用系统相机拍照业务流程

(1)判断是否有权限,如果没有权限则获取权限,如果有权限则调用相机

private void requestCameraPermission() {

    int camera = ContextCompat.checkSelfPermission(mContext, Manifest.permission.CAMERA);
    if (camera != PackageManager.PERMISSION_GRANTED) {
        mContext.requestPermissions(new String[]{Manifest.permission.CAMERA}, CAMERA_COD);
    } else {
        goTakePhoto();
    }
}

 

(2)启动相机拍照

/**
 * 去拍照
 */
private void goTakePhoto() {
    //注意:此处Intent不需要设置Data和Type
    Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

        openCameraIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        tempUri = FileProvider.getUriForFile(BaseApplication.getInstance(), BuildConfig.APPLICATION_ID + ".fileProvider", file);
        saveUri = FileProvider.getUriForFile(BaseApplication.getInstance(), BuildConfig.APPLICATION_ID + ".fileProvider",
                new File(Environment.getExternalStorageDirectory(), "image.jpg"));
    } else {
        tempUri = Uri.fromFile(file);
        saveUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "image.jpg"));
    }
    openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
    mContext.startActivityForResult(openCameraIntent, TAKE_PICTURE);
}

 

(3)裁剪图片

/**
 * 裁剪图片方法实现
 *
 * @param uri
 */
protected void startPhotoZoom(Uri uri) {

    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");//此处的uri即第(2)中的tempUri
    intent.putExtra("crop", "true");
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("outputX", 120);
    intent.putExtra("outputY", 120);
    intent.putExtra("return-data", false);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, saveUri);
    mContext.startActivityForResult(intent, CROP_SMALL_PICTURE);
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值