首先,先贴上样本代码

//检查权限
public void checkPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
//发现没有权限,调用requestPermissions方法向用户申请权限,requestPermissions接收三个参数,第一个是context,第二个是一个String数组,我们把要申请的权限
//名放在数组中即可,第三个是请求码,只要是唯一值就行
} else {
openAlbum();//有权限就打开相册
}
} public void openAlbum() {
//通过intent打开相册,使用startactivityForResult方法启动actvity,会返回到onActivityResult方法,所以我们还得复写onActivityResult方法
Intent intent = new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent, CHOOSE_PHOTO);
}
//弹出窗口向用户申请权限 @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);//弹出授权的窗口,这条语句也可以删除,没有影响
//获得了用户的授权结果,保存在grantResults中,判断grantResult中的结果来决定接下来的操作
switch (requestCode) {
case 1: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openAlbum();
} else {
Toast.makeText(this, "授权失败,无法操作", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
} @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case CHOOSE_PHOTO:
if (resultCode == RESULT_OK) {
if (Build.VERSION.SDK_INT >= 19) {
handleImageOnkitKat(data);//高于4.4版本使用此方法处理图片
} else {
handleImageBeforeKitKat(data);//低于4.4版本使用此方法处理图片
}
}
break;
default:
break;
}
} @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];//解析出数字格式的id
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())) {
imagePath = getImagePath(uri, null);
}
displayImage(imagePath);
} private void handleImageBeforeKitKat(Intent data) {
Uri uri = data.getData();
String imagePath = getImagePath(uri, null);
displayImage(imagePath);
} //获得图片路径
public String getImagePath(Uri uri, String selection) {
String path = null;
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 bitImage = BitmapFactory.decodeFile(imagePath);//格式化图片

mImage.setImageBitmap(bitImage);
//为imageView设置图片 } else {
Toast.makeText(MainActivity.this, "获取图片失败", Toast.LENGTH_SHORT).show();
}
}

使用说明:

一、在AndroidManiFest文件中添加存储卡权限

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

二、通过findviewbyid找到Button或者是imageButton,并绑定监听事件

三、复制上述的样本代码放在onClick事件下面,同时,添加一个全局静态变量

四、在button或者是imageButton的点击事件调用checkPermission方法

五、通过findviewbyid找到ImageView,修改display方法中的调用设置图片的对象名为实际项目中的imageView的对象名,详情可以看代码加红的部分,将mImage修改即可

简单的逻辑介绍:

画了一张流程图,逻辑还是比较清晰的,这里就不做过多说明

PS:其实还可以在最后面添加裁剪图片的操作,之后在设置图片,我上度娘搜索了资料,看得还是很懵逼,等研究透彻再做补充了

Demo下载

Android开发模板代码(一)——简单打开图库选择照片的更多相关文章

  1. Android开发模板代码(二)——为ImageView设置图片,退出后能保存ImageView的状态

    接着之前的那个从图库选择图片,设置到ImageView中去,但是,我发现了一个问题,就是再次进入的时候ImageView是恢复到了默认状态,搜索了资料许久之后,终于是发现了解决方法,使用SharePr ...

  2. 36个Android开发常用代码片段

    //36个Android开发常用代码片段 //拨打电话 public static void call(Context context, String phoneNumber) { context.s ...

  3. Android 开发有用代码积累

    Android开发需求变化快,开发周期要求尽量短,接下来一系列文章从实际使用出发总结一些常用的代码片段,便于查找,也为后来人提供一份参考. 1.获取Manifest的基本信息(升级页面和软件关于页面一 ...

  4. 【Android开发那点破事】打开APP加载页面实现

    今天的破事呢就说说APP加载页面的实现.一般情况下,当APP打开的时候,我们需要做很多事情,比如检查网络连接啊,初始化一些配置啊等等.我们可以让这些事情在APP完全打开之前做完,然后呢在打开的过程中显 ...

  5. Android开发——高斯模糊效果的简单实现

    0. 前言 在Android开发中,经常在音乐软件中看到高斯模糊效果. 在找遍了所有高斯模糊的算法代码后,发现stackblur的Java实现是最快的.效果如下所示. 1.  高斯模糊效果实现 Bit ...

  6. android开发之代码混淆

    在${user.home}/project.properties文件中设置proguard.config属性 # To enable ProGuard to shrink and obfuscate ...

  7. Android开发常用代码片段

    拨打电话 public static void call(Context context, String phoneNumber) { context.startActivity( new Inten ...

  8. Android开发技巧——PagerAdapter再简单的包

    再次内容View的ViewPager该适配器PagerAdapter简包,支持List数据与SparseArray数据.随着更新的浏览功能. 首先,首先贴上顶部抽象类代码: /* * Date: 14 ...

  9. Android开发中代码下面出现波浪线问题

    在Android Studio中写代码时,经常会在一个英文单词的下面出现波浪线,这是因为系统检测到你的这个英文单词不符合规范,如下所示: 解决办法:选中这个单词,点击鼠标右键,点击:Spelling ...

随机推荐

  1. python requirements使用方法

    记得导入导出包的时候要想激活虚拟环境. 1.导出requirements方法 pip freeze > requirements.txt 2.安装requirements方法 pip insta ...

  2. uboot中 make xxx_config 的作用(以make smdk2410_config为例)

    1.创建到目标板相关文件的链接 ln -s asm-arm asm ln -s arch-s3c24x0 asm-arm/arch ln -s proc-armv asm-arm/proc 2.创建i ...

  3. vb代码之-------当窗体BorderStyle属性为0时,添加窗口预览到任务栏

    入吾QQ群183435019 (学习 交流+唠嗑) 有很多时候,我们为了美观,将会自己画一个标题栏,这时候我们会把原来的标题栏取消掉,最简单的方法是吧窗体的BorderStyle设置成为0, 然后自己 ...

  4. IntelliJ IDEA 教程(1)

    过完年,新的学习阶段又开始了.星爷的电影票还没还,国民岳父(韩寒)的礼钱也没送,王老板说再立一个小目标,马老板说我不在乎钱...学习还得继续. IntelliJ Idea 简称IDEA,是java语言 ...

  5. ajaxfileupload插件,C#返回Json数据报错

    报错信息一:jQuery.handleError is not a function 上传图片的时候,通过F12,查看到这个错误. 解决方案: jquery版本问题,handlerError只在jqu ...

  6. Object.keys、Object.getOwnPropertyNames区别

    用途 Object.keys 定义:返回一个对象可枚举属性的字符串数组: Object.getOwnPropertyNames 定义:返回一个对象可枚举.不可枚举属性的名称: 属性的可枚举性.不可枚举 ...

  7. 【转】TCP粘包分析

    一 .两个简单概念长连接与短连接: 1.长连接     Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接收. 2.短连接     Client方与Server每 ...

  8. Rosenblatt感知器

    一.定义 Rosenblatt感知器建立在一个线性神经元之上,神经元模型的求和节点计算作用于突触输入的线性组合,同时结合外部作用的偏置,对若干个突触的输入项求和后进行调节. 二.基本计算过程 Rose ...

  9. Java面向对象抽象类案例分析

    /** 雇员示例: 需求:公司中程序员有姓名,工号,薪水,工作内容 项目经理除了有姓名,工号,薪水还有奖金,工作内容 对给出需求进行数据建模 分析: 在这个问题领域中,先找出涉及的对象 通过名词提炼法 ...

  10. POJ3258-River Hopscotch-二分

    这个题就是排排坐,二分就可以了... River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1325 ...