因为今天写一个案例需要用到打开手机自带图库这个功能,就在网上找了一下,结果发现网上的代码不全,运行出错,就想起了书中的代码,代码来自于第一行代码第八章

布局文件中只有一个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调用手机自带图库选择图片相关推荐

  1. android 从手机自带图库选取图片作为应用背景图

    1.用intent打开系统图库 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);intent.setType("image/*&q ...

  2. android调用手机自带计算器,Android实现简易的计算器

    本文实例为大家分享了Android实现简易的计算器的具体代码,供大家参考,具体内容如下 布局(activity_main.xml) xmlns:tools="http://schemas.a ...

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

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

  4. Android开发:调用系统图库选择图片

    方法: //调用系统图库选择图片 public Intent selectPicture() {Intent intent = new Intent(Intent.ACTION_PICK,androi ...

  5. android安装自动打开网页,Android调用系统自带浏览器打开网页的实现方法

    Android调用系统自带浏览器打开网页的实现方法 在Android中可以调用自带的浏览器,或者指定一个浏览器来打开一个链接.只需要传入一个uri,可以是链接地址. 启动android默认浏览器 在A ...

  6. android怎么把动图变成视频格式,Android 录制手机屏幕视频生成GIF图片实例详解

    Android 录制手机屏幕视频生成GIF图片实例详解 无图无真相,在我们日常的网络交流中往往需要给交流对象提供直观的显示,而视频是一个很好的方式,但是视频需要播放器,还需要当做文件进行对点传输,并不 ...

  7. Android 调用手机系统照相机拍照

    Android 调用手机系统照相机拍照 并用ImageView显示    此方法获得的是拍照的原图片而非缩略图. 1.首先是布局文件activity_main.xml <RelativeLayo ...

  8. 安卓兼容7.0图库选择图片生成二维码

    上一篇文章生成二维码没有完善,这次来完善一下图库选择图片生成二维码,代码和上次的差不多,安卓6.0后打开相机和图册必须判断是否已经获得权限,只有用户设置获取权限才能访问,要不是访问不了的,代码比较多, ...

  9. Android调用手机图库选择图片并调用手机的图片裁剪工具

    /*** 获得图库图片回调标识*/public static final int GET_PIC_FROM_GALLERY = 0X100;/*** 调用手机工具编辑图片标识*/public stat ...

  10. Android调用系统自带的文件管理器进行文件选择

    这几天在做的项目网盘.上传时需要用到调用系统自带的文件管理器来选择文件,后来就在考虑怎么调用,网上也搜了很久,没有很好的解决方法,后来在一瞬间发现了一篇不错的文章,借鉴了一下代码. [java] vi ...

最新文章

  1. svn 代码管理工具
  2. 快速配置MPLS ×××
  3. 归并排序执行次数_十大排序算法,看这篇就够了
  4. python好玩的代码_一行 Python 能实现什么丧心病狂的功能?
  5. css使按钮固定在界面上面
  6. python类的属性和对象属性_Python打印对象的全部属性
  7. 在Oracle用SQL处理以 System.currentTimeMillis
  8. 【Caffe实践】基于CNN的性别、年龄识别的代码实现
  9. ActiveMQ(三)——JMS消息结构、JMSReplyTo、面试题(消息丢失,消息重复,消息顺序)
  10. Java面试:反射机制
  11. TCP 实战抓包分析
  12. 每当这些游戏发售,各国旅游部门就笑得合不拢嘴了
  13. LeetCode.1046-最后的石头重量(Last Stone Weight)
  14. 固态服务器维护,固态硬盘保养和维护
  15. linux无线网卡驱动分析,基于Linux的无线网卡驱动程序
  16. 设计模式之观察者模式(Observable与Observer)
  17. 将网页全屏显示的三种方法
  18. 【Python可视化】2021年最新世界大学排名,来看看你的母校上榜没~
  19. 神都夜行录无法显示服务器,神都夜行录登录不上怎么办 登录不上解决方案
  20. fuchsia Zircon Hypervisor:调测手段

热门文章

  1. ajax data=text,jQuery ajax dataType值为text json探索分享
  2. 【吹爆】2022金三银四高频面试题最强合集
  3. matlab画PV曲线程序,Matlab模拟包络线形成:Envolope程序
  4. MS5611气压计数据采集(模拟IIC)/温度采集/相对高度求解
  5. 判断奇数和偶数不常见的方法
  6. 设置win10锁屏壁纸为桌面背景
  7. 软件测试这个工作入门难不难?
  8. 超人段永平的网易博客文集
  9. 三菱Q系列PLC ,QD77MS16走总线控制伺服项目
  10. React.js介绍