Android调用手机自带图库选择图片
因为今天写一个案例需要用到打开手机自带图库这个功能,就在网上找了一下,结果发现网上的代码不全,运行出错,就想起了书中的代码,代码来自于第一行代码第八章
布局文件中只有一个button和ImageView,其中button用于打开手机自带图库选择图片,imageview用于显示选中的图片。
布局文件如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.sun.bluetooth.PicActivity"><ImageView android:id="@+id/iv_pic" android:src="@mipmap/pic" android:layout_width="match_parent" android:layout_height="400dp" android:scaleType="centerCrop"/><Button android:layout_marginTop="16dp" android:id="@+id/btu_select" android:text="选取系统相册照片" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center"/> </LinearLayout>
接着实例化控件,在button的点击事件监听中用于打开系统相册,因为相册中的照片都是存储在sd卡上的,所以需要早Manifest文件中添加sd卡的权限,sd卡的权限属于危险权限所以需要进行运行时处理,如下所示:
添加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
button的点击事件和运行时权限处理:
@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_pic);mButton = (Button) findViewById(R.id.btu_select);mButton.setOnClickListener(new View.OnClickListener() {@Override public void onClick(View v) {if (ContextCompat.checkSelfPermission(PicActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(PicActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);} else {//打开系统相册 openAlbum();}}});mImageView = (ImageView) findViewById(R.id.iv_pic); }private void openAlbum() {Intent intent = new Intent("android.intent.action.GET_CONTENT");intent.setType("image/*");startActivityForResult(intent, REQUEST_SYSTEM_PIC);//打开系统相册 }@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {switch (requestCode) {case 1:if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {openAlbum();} else {Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();}break;default:} }
当选择完图片后会回到onActivityResult方法中,在该方法中来处理图片。处理图片时,由于Android版本从4.4开始,选取相册中的图片返回的不再是真实的uri,而是封装过的uri,因此需要进行版本判断从而选择合适的处理方式,代码如下所示:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_SYSTEM_PIC && resultCode == RESULT_OK && null != data) {if (Build.VERSION.SDK_INT >= 19) {handleImageOnKitkat(data);} else {handleImageBeforeKitkat(data);}} }@TargetApi(19) private void handleImageOnKitkat(Intent data) {String imagePath = null;Uri uri = data.getData();if (DocumentsContract.isDocumentUri(this, uri)) {//如果是document类型的uri,则通过document id处理 String docId = DocumentsContract.getDocumentId(uri);if ("com.android.providers.media.documents".equals(uri.getAuthority())) {String id = docId.split(":")[1];String selection = MediaStore.Images.Media._ID + "=" + id;imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {Uri contentUri = ContentUris.withAppendedId(Uri.parse("content:" +"//downloads/public_downloads"), Long.valueOf(docId));imagePath = getImagePath(contentUri, null);}} else if ("content".equalsIgnoreCase(uri.getScheme())) {//如果是content类型的uri,则使用普通方式处理 imagePath = getImagePath(uri, null);} else if ("file".equalsIgnoreCase(uri.getScheme())) {//如果是File类型的uri,直接获取图片路径即可 imagePath = uri.getPath();}displayImage(imagePath);//根据图片路径显示图片 }private void handleImageBeforeKitkat(Intent data) {Uri uri = data.getData();String imagePath = getImagePath(uri, null);displayImage(imagePath);}private String getImagePath(Uri uri, String selection) {String path = null;//通过uri和selection来获取真实的图片路径 Cursor cursor = getContentResolver().query(uri, null, selection, null, null);if (cursor != null) {if (cursor.moveToFirst()) {path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));}cursor.close();}return path; }private void displayImage(String imagePath) {if (imagePath != null) {Bitmap bitmap = BitmapFactory.decodeFile(imagePath);mImageView.setImageBitmap(bitmap);} else {Toast.makeText(this, "failed to get image", Toast.LENGTH_SHORT).show();} }
Android调用手机自带图库选择图片相关推荐
- android 从手机自带图库选取图片作为应用背景图
1.用intent打开系统图库 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);intent.setType("image/*&q ...
- android调用手机自带计算器,Android实现简易的计算器
本文实例为大家分享了Android实现简易的计算器的具体代码,供大家参考,具体内容如下 布局(activity_main.xml) xmlns:tools="http://schemas.a ...
- Android开发之调用相机拍照与本地图库选择图片
引用链接 Android开发之调用相机拍照与本地图库选择图片 Android调用相机实现拍照功能 部分截图 引言 小项目有一个访问相册的需求,在网上查找得到两位大神博客指点,但博客发布时间过旧,难免因 ...
- Android开发:调用系统图库选择图片
方法: //调用系统图库选择图片 public Intent selectPicture() {Intent intent = new Intent(Intent.ACTION_PICK,androi ...
- android安装自动打开网页,Android调用系统自带浏览器打开网页的实现方法
Android调用系统自带浏览器打开网页的实现方法 在Android中可以调用自带的浏览器,或者指定一个浏览器来打开一个链接.只需要传入一个uri,可以是链接地址. 启动android默认浏览器 在A ...
- android怎么把动图变成视频格式,Android 录制手机屏幕视频生成GIF图片实例详解
Android 录制手机屏幕视频生成GIF图片实例详解 无图无真相,在我们日常的网络交流中往往需要给交流对象提供直观的显示,而视频是一个很好的方式,但是视频需要播放器,还需要当做文件进行对点传输,并不 ...
- Android 调用手机系统照相机拍照
Android 调用手机系统照相机拍照 并用ImageView显示 此方法获得的是拍照的原图片而非缩略图. 1.首先是布局文件activity_main.xml <RelativeLayo ...
- 安卓兼容7.0图库选择图片生成二维码
上一篇文章生成二维码没有完善,这次来完善一下图库选择图片生成二维码,代码和上次的差不多,安卓6.0后打开相机和图册必须判断是否已经获得权限,只有用户设置获取权限才能访问,要不是访问不了的,代码比较多, ...
- Android调用手机图库选择图片并调用手机的图片裁剪工具
/*** 获得图库图片回调标识*/public static final int GET_PIC_FROM_GALLERY = 0X100;/*** 调用手机工具编辑图片标识*/public stat ...
- Android调用系统自带的文件管理器进行文件选择
这几天在做的项目网盘.上传时需要用到调用系统自带的文件管理器来选择文件,后来就在考虑怎么调用,网上也搜了很久,没有很好的解决方法,后来在一瞬间发现了一篇不错的文章,借鉴了一下代码. [java] vi ...
最新文章
- svn 代码管理工具
- 快速配置MPLS ×××
- 归并排序执行次数_十大排序算法,看这篇就够了
- python好玩的代码_一行 Python 能实现什么丧心病狂的功能?
- css使按钮固定在界面上面
- python类的属性和对象属性_Python打印对象的全部属性
- 在Oracle用SQL处理以 System.currentTimeMillis
- 【Caffe实践】基于CNN的性别、年龄识别的代码实现
- ActiveMQ(三)——JMS消息结构、JMSReplyTo、面试题(消息丢失,消息重复,消息顺序)
- Java面试:反射机制
- TCP 实战抓包分析
- 每当这些游戏发售,各国旅游部门就笑得合不拢嘴了
- LeetCode.1046-最后的石头重量(Last Stone Weight)
- 固态服务器维护,固态硬盘保养和维护
- linux无线网卡驱动分析,基于Linux的无线网卡驱动程序
- 设计模式之观察者模式(Observable与Observer)
- 将网页全屏显示的三种方法
- 【Python可视化】2021年最新世界大学排名,来看看你的母校上榜没~
- 神都夜行录无法显示服务器,神都夜行录登录不上怎么办 登录不上解决方案
- fuchsia Zircon Hypervisor:调测手段