写在前面

近期项目的需求是需要去调用相机相册去拍照获取图片保存到服务器

公司的测试机试Android6.0以下的 所以之前调用相机一点都没问题 可是跑在Android8.0+的手机上 调用相机相册就会出现错误

暴露的Url

所以在博客找到了相关文章,结合自身的需求 总结了这篇文章 希望能给您带来帮助

1.Android6.0+需要动态申请权限,请参考博文

                    Android 6.0动态访问权限(相机为例)

2.我们需要在AndroidMainfest如下配置

<!-- 适配Android8.0调用相机报错的问题 -->
<providerandroid:name="android.support.v4.content.FileProvider"android:authorities="(您的包名).fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" />
</provider><activity android:name=".business.archives.activity.HrAuthenticationActivity"></activity>

3.在res文件下 创建一个名为xml的文件 在其中创建一个以 上面的代码中

android:resource="@xml/file_paths" />  file_paths 一样的文件名

4.file_paths文件

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

5.在需要调用相机的Activity/Fragment 加入需要准备的变量和常量

//文件

private File file;//相机请求码
private final int REQUEST_CAMERA = 1;

6.调用相机的代码

private void useCamera() {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/test/" + System.currentTimeMillis() + ".jpg");file.getParentFile().mkdirs();//改变Uri  com.xykj.customview.fileprovider注意和xml中的一致Uri uri = FileProvider.getUriForFile(this, "com.miaoyin.zcda.fileprovider", file);//添加权限intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);startActivityForResult(intent, REQUEST_CAMERA);
}

7.申请写入权限

public void applyWritePermission() {String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};if (Build.VERSION.SDK_INT >= 23) {int check = ContextCompat.checkSelfPermission(this, permissions[0]);// 权限是否已经 授权 GRANTED---授权  DINIED---拒绝if (check == PackageManager.PERMISSION_GRANTED) {//调用相机useCamera();} else {requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);}} else {useCamera();}
}

8.以下为必要代码 cv

/*** 拍照的,照片路径*/
public void jsPath() {//获取SD卡安装状态String state = Environment.getExternalStorageState();if (state.equals(Environment.MEDIA_MOUNTED)) {//设置图片保存路径photoPath = SAVED_IMAGE_PATH + "/" + System.currentTimeMillis() + ".png";File imageDir = new File(photoPath);if (!imageDir.exists()) {try {//根据一个 文件地址生成一个新的文件用来存照片imageDir.createNewFile();} catch (IOException e) {e.printStackTrace();}}takePhotoByMethod1();} else {Toast.makeText(SubmitCarryCampLicenseActivity.this, "SD卡未插入", Toast.LENGTH_SHORT).show();}
}
private void takePhotoByMethod1() {//实例化intent,指向摄像头Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//根据路径实例化图片文件File photoFile = new File(photoPath);//设置拍照后图片保存到文件中intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));//启动拍照activity并获取返回数据startActivityForResult(intent, REQUEST_CAMERA);
}

9.onActivityResult 回调代码

        if (requestCode == REQUEST_CAMERA && resultCode == RESULT_OK) {
//            Log.e("TAG", "---------" + FileProvider.getUriForFile(this, "com.xykj.customview.fileprovider", file));//在手机相册中显示刚拍摄的图片if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);Uri contentUri = Uri.fromFile(file);String path = contentUri.getPath();Log.e("TAGSSSSSSSSS", contentUri.toString());//文件的路径String absolutePath = file.getAbsolutePath();//文件的名字String parent = file.getName();Log.e("TAGQQQQQQQQQ", parent + "===" + absolutePath);mediaScanIntent.setData(contentUri);sendBroadcast(mediaScanIntent);//设置图片sdPic.setImageBitmap(BitmapFactory.decodeFile(file.getAbsolutePath()));}else{File photoFile = new File(photoPath);if (photoFile.exists()) {//通过图片地址将图片加载到bitmap里面Bitmap bm = BitmapFactory.decodeFile(photoFile.getAbsolutePath());//将拍摄的照片显示到界面上//这是返回来的路径
//                    results.confirm(pathsa);Toast.makeText(SubmitCarryCampLicenseActivity.this, "通过", Toast.LENGTH_LONG).show();} else {Toast.makeText(SubmitCarryCampLicenseActivity.this, "图片文件不存在", Toast.LENGTH_LONG).show();}}}

10.在权限回调用加入一下代码

if (requestCode == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {useCamera();
} else {// 没有获取 到权限,从新请求,或者关闭appToast.makeText(this, "需要存储权限", Toast.LENGTH_SHORT).show();
}

11.加入调用相册的代码

public void showPhoto() {Intent it1 = new Intent(Intent.ACTION_PICK);it1.setType("image/*");mPhoto = 1;startActivityForResult(it1, 200);
}

12.加入相册剪裁功能

if (requestCode == 200 && resultCode == RESULT_OK) {Intent it = new Intent("com.android.camera.action.CROP");it.putExtra("crop", true);Uri data1 = data.getData();it.setDataAndType(data1, "image/*");it.putExtra("aspactX", 1);it.putExtra("aspactY", 1);it.putExtra("outputX", 80);it.putExtra("outputY", 80);it.putExtra("return-data", true);startActivityForResult(it, 300);}

到这里8.0+调用相册就完成了 

    希望能对您有所帮助

 

Android 8.0+调用相机相册相关推荐

  1. android 7.0 按钮崩溃,Android 7.0调用相机崩溃详解及解决办法

    Android 7.0调用相机崩溃解决办法 错误提示: android.os.FileUriExposedException: file:///storage/emulated/0/DCIM/IMG_ ...

  2. android最新相机打不开,Android 7.0调用相机崩溃详解及解决办法

    Android 7.0调用相机崩溃解决办法 错误提示: android.os.FileUriExposedException: file:///storage/emulated/0/DCIM/IMG_ ...

  3. Android 7.0调用相机崩溃

    错误提示: android.os.FileUriExposedException: file:///storage/emulated/0/DCIM/IMG_1041503431.jpg exposed ...

  4. cocos creator 调用相机相册裁剪图片并上传到服务器

    大致思路就是creator里面js调用Java和object-c代码,调起系统相机相册,选取图库图片/拍照图片进行裁剪,然后转化为base64字符串,最后通过http post请求上传到服务器. Ja ...

  5. Android开发之调用相机拍照与本地图库选择图片

    引用链接 Android开发之调用相机拍照与本地图库选择图片 Android调用相机实现拍照功能 部分截图 引言 小项目有一个访问相册的需求,在网上查找得到两位大神博客指点,但博客发布时间过旧,难免因 ...

  6. uniapp中调用相机相册/上传/扫码整理

    调用相机相册 uni.chooseImage({count: 1,sizeType: ['original', 'compressed'],sourceType: ['camera','album'] ...

  7. Android开发 8.0及以上调用相机/相册,并根据Uri获取图像绝对路径,并进行文件上传

    一.权限问题 可能会遇到的问题 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() Permissio ...

  8. Android—显示窗口调用相机与相册

    关于Android点击头像显示窗口调用相机与相册 主要有七步: 点击事件,窗口初始化,点击回调事件,对照片裁剪,裁剪照片保存,声明FileProvider,编写FileProvider的xml文件 1 ...

  9. android 7.0 调用系统相机崩溃的解决方案(非谷歌官方推荐)

    解决方案: 1.(推荐)7.0之后你的app就算有权限,给出一个URI之后手机也认为你没有权限. 不用修改原有代码,在Application的oncreate方法中:(或者直接放在调用相机的activ ...

最新文章

  1. 26进制(字母)转十进制算法
  2. 使用jquery-easyui写的CRUD插件(2)
  3. 信用风险模型(申请评分、行为评分)与数据准备(违约期限、WOE转化)
  4. 2010 模板下载 罗斯文_俄罗斯签证办理攻略
  5. boost::mp11::mp_set_intersection相关用法的测试程序
  6. c语言开发工具程序代码是什么文件,【C语言】开发工具--GCC使用入门
  7. 获取计算机内存镜像文件,计算机取证中的内存镜像获取的研究与实现
  8. leetcode57. 插入区间
  9. idea中.ignore插件的使用
  10. JavaScript DOM编程艺术第一章:JavaScript简史
  11. redis 性能监控和排查
  12. windows下批量更改文件后缀
  13. LU分解算法(串行、并行)
  14. ms17010漏洞利用(主机漏洞利用)
  15. 源码级剖析了 Naive UI 的 Button 完整过程
  16. k8s二进制部署 1.17.3
  17. WPS、office使用入坑心得
  18. 异常(The host [tomcat_server] is not valid)(Nginx配置异常)
  19. sequoia中的自动故障处理
  20. element tab如何居中_如何用思维导图提高工作效率

热门文章

  1. Android 跳转外部浏览器坑
  2. java的nullpoint_Java中避免NullPointerException的方法总结
  3. python--敲击木鱼积累功德小项目
  4. 计算机和计算机之间如何传送文件,两台电脑实现互传文件:多种方法可选择
  5. 一个男孩子如果到了23岁,就不会再长高了。。。
  6. NASA12.5米高程DEM下载与5米等高线的提取方法
  7. 【图像分割】萤火虫算法图像聚类分割【含Matlab源码 2106期】
  8. 【diannaoxitong】查看路由器ADSL帐号密码方法
  9. 安卓Android基于百度云平台人脸识别学生考勤签到系统设计
  10. 三极管 场效应管(MOS管) 引脚