Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题

1.调用相机,兼容7.0

AndroidManifest配置

<providerandroid:name="android.support.v4.content.FileProvider"android:authorities="xxx.xxx.xxx"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/provider_paths"/>
</provider>

authorities="applicationId.fileprovider"

如果有其他第三方包配置过provider,可以自定义继承FileProvider例如

public class MyFileProvider extends FileProvider {
}
<providerandroid:name=".MyFileProvider"android:authorities="${applicationId}.provider"android:grantUriPermissions="true"android:exported="false"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/filepaths" /></provider>

在资源文件中 新建xml文件夹,然后对应上面的resource 文件名 filepaths

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

file-path 表示你应用内部存储区域的文件的子目录。这个子目录和getFilesDir()的返回值一样。external-path 表示你应用外部存储区域的文件的子目录。这个子目录和getExternalFilesDir()的返回值一样。cache-path 表示你应用内部存储区域的缓存子目录。这个子目录的根目录和getCacheDir()的返回值一样。(如果你修改了provider和paths中的值,需要把应用卸载重装或者开关机一下才能看到变化。)

FileProvider 是 ContentProvider 的一个特殊的子类,它有利于安全地分享应用相关的文件,通过对一个文件创建content:// Uri而不是file:/// Uri。

由于FileProvider的默认功能包括文件的content URI的生成,你并不需要在代码中定义一个子类。相反,你可以在你的应用中包含一个FileProvider通过在XML文件中指定它。对于指定FileProvider,添加一个元素在你应用的清单文件中。设置android:name属性为android.support.v4.content.FileProvider。根据你控制的域名设置android:authorities属性为一个URI authority(authorities可以随意填写,但是要保证使用时与authority保持一致,推荐applicationId.fileprovider,以免定义重复)。设置android:exported属性为false;FileProvider不需要公开。设置android:grantUriPermissions属性为true,为了允许你进行临时访问文件的授权。

一个FileProvider只能生成一个content URI 对应你事先指定目录下的文件。对于指定一个目录,使用元素的子元素,在XML中指定它的存储区域和路径。例如,下面的paths元素告诉FileProvider你打算请求你的私有文件区域的 images/ 子目录的content URIs

<files-pathname="name"path="path"/> <!--相当 Context.getFilesDir() + path, name是分享url的一部分--><cache-pathname="name"path="path"/> <!--getCacheDir()--><external-pathname="name"path="path"/> <!--Environment.getExternalStorageDirectory()--><external-files-pathname="name"path="path"/><!--getExternalFilesDir(String) Context.getExternalFilesDir(null)--><external-cache-pathname="name"path="path"/> <!--Context.getExternalCacheDir()-->
拍照
 /*** 拍照*/protected void takePic() {Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);File file = new File(FileConstanse.getCacheImagePath(), FileConstanse.IMAGE_CACHE);tempUri = Uri.fromFile(file);// 指定照片保存路径(SD卡)if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//7.0及以上使用FileProvider获取UriopenCameraIntent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);String authority =  getPackageName()+".provider";Uri contentUri = FileProvider.getUriForFile(mContext, authority,file);openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);} else {openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);}startActivityForResult(openCameraIntent, TAKE_PICTURE);}

打开相册 以下两种方法即可

 /*** 选择相册*/protected void selectPic() {Intent intentFromGallery;
//        当sdk版本低于19时使用此方法if (Build.VERSION.SDK_INT < 19) {intentFromGallery = new Intent(Intent.ACTION_GET_CONTENT);intentFromGallery.setType("image/*");} else {intentFromGallery = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);}
//        Intent intentFromGallery = new Intent(Intent.ACTION_PICK);
//        intentFromGallery.setType("image/*");//相片类型startActivityForResult(intentFromGallery, CHOOSE_PICTURE);}

然后 onActivityResult

 @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (RESULT_OK == resultCode) {switch (requestCode) {case TAKE_PICTURE://相机File file = new File(FileConstanse.getCacheImagePath(), FileConstanse.IMAGE_CACHE_NEW);if (rotaImg(tempUri.getPath(),file)){tempUri =  Uri.fromFile(file);}crop(102, 37);//进行裁剪break;case CHOOSE_PICTURE://相册File filePic = new File(FileConstanse.getCacheImagePath(), FileConstanse.IMAGE_CACHE_NEW);tempUri = data.getData();String path = ImageUtils.getRealPathFromUri(mContext, tempUri);if (rotaImg(path,filePic)){tempUri =  Uri.fromFile(filePic);}crop(102, 37);break;case Crop.REQUEST_CROP://裁剪ImageLoadConfig.loadNomalPicWithoutChache(mContext, outPutUri, ivPic);break;}}}

如愿一切如愿的话,就不会有这篇文章了,奇葩的小米手机出现了图片横竖不分,如果是拍照或者从相册拿出来以前拍照的图片,竖着拍照的图片是横向的。这个想到的方法是将图片按照之前的角度给他再旋转回去。

 /*** 获取图片的旋转角度* @param imgPath 图片路径* @return 返回旋转角度*/public static int getBitmapRotateAngle(String imgPath) {// 判断图片方向int digree = 0;ExifInterface exif = null;try {exif = new ExifInterface(imgPath);} catch (IOException e) {e.printStackTrace();exif = null;}if (exif != null) {int ori = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_UNDEFINED);switch (ori) {case ExifInterface.ORIENTATION_ROTATE_90:digree = 90;break;case ExifInterface.ORIENTATION_ROTATE_180:digree = 180;break;case ExifInterface.ORIENTATION_ROTATE_270:digree = 270;break;default:digree = 0;break;}}return digree;}
 /*** * @param path 图片路径* @param digree 旋转角度* @return*/public static Bitmap creatBitmap(String path,int digree){Bitmap bitmap = BitmapFactory.decodeFile(path);Bitmap bitmapRe;// 旋转图片Matrix m = new Matrix();m.postRotate(digree);bitmapRe = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),bitmap.getHeight(), m, true);if (bitmap!=bitmapRe){bitmap.recycle();}return  bitmapRe;}
 /*** 将bitmap作为一张图片存入到指定路径** @param bitmap* @param file*/public static void storeImage(Bitmap bitmap, File file) {FileOutputStream os;try {os = new FileOutputStream(file);bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);os.flush();os.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

相册拿到的uri要转换成path,才能得到图片的旋转角度

public static String getRealPathFromUri(Context context, Uri contentUri) {Cursor cursor = null;try {String[] proj = { MediaStore.Images.Media.DATA };cursor = context.getContentResolver().query(contentUri, proj, null, null, null);int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);cursor.moveToFirst();return cursor.getString(column_index);} finally {if (cursor != null) {cursor.close();}}}

至此完成。

Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题相关推荐

  1. IOS开发调用系统相机和打开闪光灯

    IOS开发调用系统相机和打开闪光灯      今天给大家分享一下如何调用iphone的拍照功能和打开闪光灯,有些代码我也不太理解,很多是在网上借鉴其他人的.IOS有两种的拍照和视频的方式:1.直接使用 ...

  2. android代码调用相机,Android如何调用系统相机拍照

    本文实例为大家分享了Android调用系统相机拍照的具体代码,供大家参考,具体内容如下 /** * 调用系统相机 */ private void takePhoto() { Uri uri = nul ...

  3. Android开发--调用系统邮件

    Android系统的开源性使其在当前智能手机市场占据绝对优势,同时也产生了各种各样的机型和系统.这使得我们Android开发人员需要根据不同的机型和系统去做对应的适配. 正文 本篇所述需求为调用本地邮 ...

  4. android 自己调用系统相机保存的照片存到自定义文件夹里面用电脑看该照片显示0KB或者是无法查看?或者说用手机助手导出照片导出失败?

    哈哈,标题有点长,之所以这样是为了能让遇到同样问题的人方便搜索到,我自己就遇到这样的问题一直搜索不到. 我先讲一下自己遇到的问题:因为我的app有需求要拍照并且保存起来,然后我为了方便用户去相册统一查 ...

  5. android调用系统相机图片不旋转,Android 处理调用系统相机生成的被旋转图片

    主要通过获取EXIF信息进行设置: public static int readPictureDegree(String path) { int degree  = 0; try { ExifInte ...

  6. Android实现调用系统相机录像及实现录音

    录像实现原理特别简单,先在配置文件中声明一下权限,这个就不说了,然后直接使用Intent跳转就行. Intent intent = new Intent(MediaStore.ACTION_VIDEO ...

  7. android调用相机与相册的方法,手把手教你:android调用系统相机、相册功能,适配6.0权限获取以及7.0之后获取URI(兼容多版本)...

    Android中调用系统相机来拍摄照片的代码,以下:html 一.首先设置Uri获取判断以及相机请求Codejava public final int TYPE_TAKE_PHOTO = 1;//Ur ...

  8. android异常相机处理,android 调用系统相机拍照的各种异常处理

    1 本文只讨论调用系统相机出现的异常解决办法下面是调用系统相机的代码 先看一下最简单的写法 Intent intent = new Intent(android.provider.MediaStore ...

  9. 调用系统相机、相册、剪裁图片,适配Android 12

    第一步:FileProvider相关准备工作 在AndroidManifest.xml中增加provider节点: <providerandroid:name="androidx.co ...

最新文章

  1. wdatepicker设置初始时间_滑动条的滑块的初始位置应该放在哪儿?
  2. 三部门发布18个新职业:含碳排放管理员、调饮师等
  3. ASP.NET获取客户端IP及MAC地址
  4. buu [GKCTF2020]小学生的密码学
  5. “不一样”的真实渗透测试案例分析
  6. linux 774是什么权限,Linux权限
  7. $(document).ready
  8. Windows Phone 8初学者开发—第18部分:在页面间导航
  9. Linux内核空间与用户空间信息交互方法
  10. 市场项目交接文档初稿
  11. 查找——图文翔解SkipList(跳跃表)
  12. 边境的悍匪—机器学习实战:第八章 降维
  13. Gos —— 开启保护模式
  14. ggplot2颜色设置
  15. matlab一元二次回归,MATLAB一元线性回归方程的计算及检验.doc
  16. 利用Python在环境气象海洋领域实现基础计算与绘图
  17. 个人网络信息安全管理方法
  18. mysql 排序序列_Mysql序列(八)—— group by排序问题 怀瑾握瑜XI
  19. 技嘉主板大部分型号开启WOL(Wake up-On-LAN)网络唤醒与定时开机
  20. 2019-1-29-win10-uwp-使用-Microsoft.Graph-发送邮件

热门文章

  1. 一个简单的ASP登录页面
  2. ReentrantLock 实现原理笔记(一)
  3. 9行Python代码实现自动抠图 别再自己抠图啦
  4. php读取excel并导入数据,PHPExcel读取excel并导入数据库
  5. 字符叠加器 视频叠加器模块
  6. 盗将行——微信群防骗指南
  7. 6轴机器人运动学(正解)
  8. 计算股票季度收益率、年收益率和相对收益率并可视化展示。
  9. 计算机怎么更改性能模式,笔记本怎么开高性能模式 让电脑变流畅的方法详细介绍...
  10. VM虚拟机安装使用OBS直播录屏软件图文教程及注意事项