安卓操作相机or相册

笔者做这方面测试的时候,没遇到什么大坑基本上,需要注意的有两点

1.   使用相册打开读取图片需要使用运行时权限,而且还是要在AndroidManifest.xml中进行权限声明,权限声明如下:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

2.  使用相机拍照获取图片的方式,平台版本API >= 24的时候,从文件转型成Uri格式 需要使用FileProvider.getUriForFile()这个方法(ps:此方法接受三个参数,1.Context 2.一个任意字符串 3.File对象),看到了Provider你也该想到了内容提供器,那么使用了内容提供器,相应的就需要到AndroidManifest.xml文件中对内容提供器注册了,编辑如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.lichangxin.call_camera_and_photos_test"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity><providerandroid:exported="false"android:grantUriPermissions="true"android:authorities="com.example.lichangxin.call_camera_and_photos_test"android:name="android.support.v4.content.FileProvider"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths"/></provider></application></manifest>

这里 需要注意的就是 <provider>标签内的android:authorities属性的值必须要同FileProvider.getUriForFile()方法的第二个参数值相同。

另外,这里使用了<me-data>标签来指定Uri的共享路径,并引用了一个@xml/file_paths资源,这个资源文件需要手动创建,以下操作如图

好了,下面贴一张 程序的 大致流程图,方便理解。

最后是 源码:

  1 package com.example.lichangxin.call_camera_and_photos_test;
  2
  3 import android.annotation.TargetApi;
  4 import android.content.ContentUris;
  5 import android.content.Intent;
  6 import android.content.pm.PackageManager;
  7 import android.database.Cursor;
  8 import android.graphics.Bitmap;
  9 import android.graphics.BitmapFactory;
 10 import android.net.Uri;
 11 import android.os.Build;
 12 import android.provider.DocumentsContract;
 13 import android.provider.MediaStore;
 14 import android.support.annotation.NonNull;
 15 import android.support.v4.app.ActivityCompat;
 16 import android.support.v4.content.ContextCompat;
 17 import android.support.v4.content.FileProvider;
 18 import android.support.v7.app.AppCompatActivity;
 19 import android.os.Bundle;
 20 import android.util.Log;
 21 import android.view.View;
 22 import android.widget.Button;
 23 import android.widget.ImageView;
 24
 25 import java.io.File;
 26 import java.io.FileNotFoundException;
 27 import java.io.IOException;
 28 import java.util.jar.Manifest;
 29
 30 public class MainActivity extends AppCompatActivity {
 31
 32     private static final int TAKE_PHOTO = 1;
 33     private static final int CHOOSE_PHOTO = 2;
 34     private ImageView image;
 35     private Uri imageUri;
 36
 37
 38     private void ls(String tishi){
 39         Log.d("enen",tishi);
 40     }
 41
 42     @Override
 43     protected void onCreate(Bundle savedInstanceState) {
 44         super.onCreate(savedInstanceState);
 45         setContentView(R.layout.activity_main);
 46         final Button open_camera = (Button)findViewById(R.id.open_camera);
 47         final Button open_album = (Button)findViewById(R.id.open_photo_album);
 48         image = (ImageView)findViewById(R.id.image1);
 49         open_camera.setOnClickListener(new View.OnClickListener() {
 50             @Override
 51             public void onClick(View v) {
 52                 // 创建File 对象,用于存储拍摄后的照片
 53                 File outputImage = new File(getExternalCacheDir(),"output_image.jpg");        //getExternalCacheDir 获取外部存储目录
 54                 try{
 55                       if(outputImage.exists()){      // 这里进行一级过滤 若文件存在 则删除文件
 56                           outputImage.delete();
 57                       }
 58                       outputImage.createNewFile();
 59                 } catch (IOException e){
 60                     e.printStackTrace();
 61                 }
 62
 63                 if(Build.VERSION.SDK_INT >= 24){
 64                     imageUri = FileProvider.getUriForFile(MainActivity.this,"com.example.lichangxin.call_" +
 65                             "camera_and_photos_test",outputImage);
 66                 }else{
 67                     imageUri = Uri.fromFile(outputImage);  //从文件转为uri
 68                 }
 69
 70                 // 此 if - else 用来判断 平台版本,>=24 用新的API 旧的版本直接用Uri.fromFile
 71
 72                 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
 73                 intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
 74                 startActivityForResult(intent,TAKE_PHOTO);
 75
 76             }
 77
 78
 79         });
 80
 81         open_album.setOnClickListener(new View.OnClickListener() {
 82             @Override
 83             public void onClick(View v) {
 84                 if(ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
 85                         != PackageManager.PERMISSION_GRANTED){
 86                     ActivityCompat.requestPermissions(MainActivity.this,new String[]{
 87                             android.Manifest.permission.WRITE_EXTERNAL_STORAGE
 88                     },1);
 89                     ls("111111111");
 90                 }else{
 91                     //执行打开 相册操作
 92                     openAlbum();
 93                 }
 94             }
 95         });
 96     }
 97
 98     //打开相册
 99     private void openAlbum(){
100         Intent intent = new Intent("android.intent.action.GET_CONTENT");
101         intent.setType("image/*");
102         startActivityForResult(intent,CHOOSE_PHOTO);
103     }
104
105
106     @Override
107     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
108         switch (requestCode){
109             case 1:
110                 ls("2222222222");
111                 if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
112                     ls("333333333333");
113                 openAlbum();
114             }else {
115                     Log.d("enen","没有获得权限");
116                 }
117                 break;
118             default:
119                 break;
120         }
121     }
122
123
124     @Override
125     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
126         switch (requestCode){
127             case TAKE_PHOTO:
128
129                 if(resultCode == RESULT_OK){
130
131                     try{
132                         Log.d("enen","jiasi");
133                         Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
134                         .openInputStream(imageUri));
135                         image.setImageBitmap(bitmap);
136                         Log.d("enen","jiasi wancheng");
137                     }catch (FileNotFoundException e){
138                         Log.d("enen","yichang");
139                         e.printStackTrace();
140                     }
141
142                 }
143                 break;
144
145             case CHOOSE_PHOTO:
146                 if(resultCode == RESULT_OK){
147
148                     if(Build.VERSION.SDK_INT >= 19){
149                         //4.4以上使用此方法处理图片
150                         handleImageOnkitKat(data);
151                     }else{
152                         //4.4一下 用此方法处理
153                         handleImageBeforeKitKat(data);
154                     }
155
156                 }
157
158
159             default:
160                 break;
161         }
162     }
163
164     @TargetApi(19)
165     private void handleImageOnkitKat(Intent data){
166         String imagePath = null;
167         Uri uri = data.getData();    //取得 系统封装过的Uri 进行解析
168         if(DocumentsContract.isDocumentUri(this,uri)){
169             //如果是document类型的Uri  通过document id处理
170             String docId = DocumentsContract.getDocumentId(uri);
171             ls(docId);  // 这里输出格式 为 image:26    证明上行代码 取出了id部分              // @***
172             if("com.android.providers.media.documents".equals(uri.getAuthority())){
173                 //
174                 String id = docId.split(":")[1];    // 字符串分割,解析出 数字格式的id  这里存在疑问  为什么以:为分隔符 (从@***行 解决疑问)
175                 String selection = MediaStore.Images.Media._ID + "=" + id;
176                 imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);
177             }else if("com.android.providers.downloads.documents".equals(uri.getAuthority())){
178                 //
179                 Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public" +
180                         "_downloads"),Long.valueOf(docId));
181                 imagePath = getImagePath(contentUri,null);
182             }
183         }else if("content".equalsIgnoreCase(uri.getScheme())){     //getScheme()  方法 用于获取该uri的协议比如 content://...中的 content
184             //如果是content类型的Uri 则使用普通方式处理
185             imagePath = getImagePath(uri,null);
186
187         }else if("file".equalsIgnoreCase(uri.getScheme())){
188             //如果是 file 类型的 Uri   则直接获取图片路径
189             imagePath = uri.getPath();
190         }
191
192         //通过 上面的 判断解析,下面来跟进图片路径显示 图片
193         dispalyImage(imagePath);
194
195     }
196
197     private void handleImageBeforeKitKat(Intent data){
198         Uri uri = data.getData();
199         String imagepath = getImagePath(uri,null);
200         dispalyImage(imagepath);
201     }
202
203     private String getImagePath(Uri uri,String selection){
204         String path = null;
205         // 通过 uri和selection 来获取 真实的 图片路径
206         Cursor cursor = getContentResolver().query(uri,null,selection,null,null);
207         if(cursor!=null){
208             if(cursor.moveToFirst()){
209                 path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
210             }
211             cursor.close();
212         }
213         return path;
214     }
215
216     private void dispalyImage(String imagepath){
217         if(imagepath != null){
218             Bitmap bitmap = BitmapFactory.decodeFile(imagepath);
219             image.setImageBitmap(bitmap);
220         }else{
221             ls("5555555555");
222         }
223     }
224
225
226 }

宾狗,今天就 记录 到这里啦?

转载于:https://www.cnblogs.com/xykjlcx/p/7055517.html

Anndroid 使用相机或相册打开图片相关推荐

  1. iOS 从相机或相册获取图片并裁剪

    /load user image - (void)UesrImageClicked { UIActionSheet *sheet; // 判断是否支持相机 if([UIImagePickerContr ...

  2. Android相机、相册获取图片显示并保存到SD卡

    如题,这个需求本不是一个很复杂的过程,但是却存在一些隐患,我也是最近在项目中碰到这个问题,将Android通过相机或相册获取图片并最终显示在界面上做了一个小研究,现将一些结果和附上的一个Demo叙述如 ...

  3. Vue 移动端调用相机和相册实现图片上传

    一.基础知识: 1.只调用手机相册 <input type="file" accept="image/*;" > 2.只调用手机相机拍照 <i ...

  4. Android 相机 或者 相册 获取图片裁剪 适用6.0/7.0

    随着Android 的版本更新迭代.本来以前代码很简单的打开相册或者相机  获取图片裁剪 给Unity3D 使用的过程 挺简单的.但是随着 Android 版本的 更新 和 安全 的加强 .有几点 和 ...

  5. android调用系统相册打开图片不显示,【报Bug】打开相册,不显示图片,选中图片后,app会崩溃...

    产品分类: uniapp/App PC开发环境操作系统: Mac PC开发环境操作系统版本号: 10 HBuilderX类型: 正式 HBuilderX版本号: 2.8.8 手机系统: Android ...

  6. 从相机相册获取图片裁剪后用于评论晒图或更换背景图

    这是我人生中写的第一篇博客,是否要纪念一下这一刻(2016.09.01 16:52).其实关于写博客,老早就有这种写法,首先觉得他能够帮我总结我学到的和用过的技术,其次还能帮助那些和我有一样需求的人, ...

  7. Android中使用封装的OKHttp上传图片,从相机和相册中获取图片并剪切

    Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切 效果: 注意: 1:网络权限 <uses-permission android:name="android.pe ...

  8. Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切

    Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切 效果: 注意: 1:网络权限 <uses-permission android:name="android.pe ...

  9. 关于小米手机从系统相册选择图片的一个bug

    在开发应用的时候碰到一个问题,拍照或者从系统相册选择图片并上传,首先从相机或者相册获取图片并压缩处理,最后再上传,代码写好并基本测试通过,然而深度测试的时候却发现有一个问题. 在小米手机,即MIUI系 ...

  10. Android 调用系统打开相机,打开相册获取图片路径

    我们在开发中经常遇到一些功能需要调取系统相机拍照获取图片,或者有的时候直接打开图库获取图片,那我们怎么获取呢,今天分享下, 第一步,打开相机 public static final int CAMER ...

最新文章

  1. Kubernetes — HOST-DEVICE CNI
  2. SWFUpload上传文件组件,跨域上传文件
  3. 【Python】sort 和 sorted 的用法区别
  4. 一根Express Route同时支持ARM和ASM的VNET
  5. 史上最快! 10小时大数据入门(一)-大数据概述
  6. 苹果Mac时间追踪工具推荐:Time Sink
  7. Head First 设计模式目录
  8. 10. 大型网站核心架构要素
  9. Java进阶:The driver is automatically registered via the SPI and manual loading of the driver class is
  10. Atitit 学习一项技术的方法总结 目录 1. 自己动手实现学习法 1 2. 七步学习法 —— 如何高效学习一项技能 1 3. 如何快速学习一项技能-十步学习法 - HugoLester - 博客
  11. 安装libgl1-mesa-dri:i386重启后黑屏问题解决
  12. VB6.0连接Oracle中文乱码
  13. 网络程序设计课程总结
  14. 校赛热身赛 Problem D. Unsolved Mystery
  15. win7原版安装版系统
  16. 关于Titan的中文整理
  17. MM 供应商账户组后台配置步骤
  18. Intel 正式宣布8代酷睿处理器:14nm、性能提升15%
  19. 在哪里找java工作_去哪里找java工作比较好找?
  20. Mybatis中用@Select传参数

热门文章

  1. 甲骨文裁员后续:近万招聘者哄抢甲骨文前员工
  2. 从0开始学习 GitHub 系列之「04.向GitHub 提交代码」
  3. java 并发编程实战代码_「Java并发编程实战」对象的组合
  4. [bzoj4826][Hnoi2017]影魔
  5. 根据ip地址查找本地时区
  6. DevExpress之TreeList绑定复杂数据类型
  7. 用栈实现队列,实现Enqueue和Dequeue方法
  8. emule学习与分析一 概述
  9. React+Webpack+Webstorm开发环境搭建
  10. 面向对象编程(五)——构造方法