【Android】安卓Q适配指南-相册

碎碎念

本来每次安卓版本升级都是非常期待的事情,但是开发者就吃苦了!!!

尤其是从Q开始,应用采用沙盒模式,即各种公共文件的访问都会受到限制。。。

所以适配Q成了当务之急,然鹅网上关于适配的资料少之又少(可能是我太菜了)

主要出现的问题:

根据图片的绝对路径无法正常加载图片,同时使用File.delete删除也是失效

直到我看到oppo开发者平台的开发指南:Android Q版本应用兼容性适配指导,才解决了这个问题!

特此记录一下。

权限申请(都是权限惹的祸)

安卓6.0以上动态申请权限,这里就写简单一点:

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

动态申请:

 private void checkPermission() {
        int readExternalStoragePermissionResult = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
        if(readExternalStoragePermissionResult != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1);
        }
    }

遍历图片

这里仍然使用ContentProvider来进行图片的获取。

首先我们要确定我们需要的内容,大概是图片路径、图片显示名称、图片ID、图片创建时间。

创建相应的Bean类:

public class PhotoBean {
    private String path;
    private String name;
    private int ID;
    private long createDate;

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public long getCreateDate() {
        return createDate;
    }

    public void setCreateDate(long createDate) {
        this.createDate = createDate;
    }

}

遍历图片:

 private List<PhotoBean> mPics = new ArrayList<>();

private void initData(){
        mPics.clear();
        ContentResolver contentResolver = getContentResolver();
        Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        Cursor query = contentResolver.query(uri,new String[]{
                MediaStore.Images.Media.DATA,
                MediaStore.Images.Media.DISPLAY_NAME,
                MediaStore.Images.Media.DATE_ADDED,
                MediaStore.Images.Media._ID},null,null,null,null);
        while(query.moveToNext()) {
            PhotoBean photoItem = new PhotoBean();
            photoItem.setPath(query.getString(0));
            //这里的下标跟上面的query第一个参数对应,时间是第2个,所以下标为1
            photoItem.setCreateDate(query.getLong(1));
            photoItem.setName(query.getString(2));
            photoItem.setID(query.getInt(query.getColumnIndex(MediaStore.MediaColumns._ID)));
            mPics.add(photoItem);
        }
        query.close();
    }

这样我们就取到了相册所有图片的信息,主要是查到这个ID

此时我们如果直接使用path来创建Bitmap去加载或者File、第三方框架均不能正确加载图片。

下面讲一下如何使用Uri来加载图片

获取Uri并加载图片

我们可以在PhotoBean中增加这个方法

 public Uri getUri(){
        Uri baseUri = Uri.parse("content://media/external/images/media");
        return Uri.withAppendedPath(baseUri, "" + ID);
    }

如果没有获取ID,只有photpath也是可以的,但影响效率:需要根据path再去查一遍

public static Uri getImageContentUri(Context context, String path) {
        Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                new String[] { MediaStore.Images.Media._ID }, MediaStore.Images.Media.DATA + "=? ",
                new String[] { path }, null);
        if (cursor != null && cursor.moveToFirst()) {
            int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
            Uri baseUri = Uri.parse("content://media/external/images/media");
            return Uri.withAppendedPath(baseUri, "" + id);
        } else {
            if (new File(path).exists()) {
                ContentValues values = new ContentValues();
                values.put(MediaStore.Images.Media.DATA, path);
                return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
            } else {
                return null;
            }
        }
    }

拿到Uri以后就可以直接使用

 Glide.with(context).load(photoBeanList.get(position).getUri()).into(imageView);

这样就没有问题了。

图片删除操作

以前我们在删除的时候,需要开发者自己添加一个确认删除的功能,现在谷歌已经帮我们完成了。

File.delete也就失效了,相对来说比较安全吧。

同样的,我们需要使用Uri来进行操作。

 @TargetApi(29)
    public void deleteUri(Uri imageUri) {
        ContentResolver resolver = getContentResolver();
        OutputStream os = null;
        try {
            if (imageUri != null) {
               resolver.delete(imageUri,null,null);
            }
        } catch (RecoverableSecurityException e1) {
            Log.d(TAG,"get RecoverableSecurityException");
            try {
                this.startIntentSenderForResult(
                        e1.getUserAction().getActionIntent().getIntentSender(),
                        100, null, 0, 0, 0);
            } catch (IntentSender.SendIntentException e2) {
                Log.d(TAG,"startIntentSender fail");
            }
        }
    }

RecoverableSecurityException在谷歌文档中是这样解释的:This exception is only appropriate where there is a concrete action the user can take to recover and make forward progress, such as confirming or entering authentication credentials, or granting access.即对于图片的修改、删除操作都需要用户的允许,即也是一种权限,故需要抛出该异常并去申请获得该权限。

如图所示:

啊,自己好菜_(¦3」∠)_

觉得文章好的欢迎点赞哦~

原文地址:https://www.cnblogs.com/robotpaul/p/12347231.html

时间: 2024-08-30 08:40:30

【Android】安卓Q适配指南-相册的相关文章

V小米Android Q适配计划公布:怒赞

6月14日消息,MIUI管理员在论坛发布“MIUI关于Android Q升级适配计划的通知”. 目前计划适配机型有小米9.红米K20 Pro.小米8.小米8透明探索版.小米8屏幕指纹版.小米MIX 2S.小米MIX 3.红米K20.红米Note 7.红米Note 7 Pro和小米9 SE等. 其中红米Note 7和红米Note 7 Pro预计2019年Q1内测(开发版),其它机型预计2019年Q4内测.小米公布Android Q适配计划:预计2019年Q4内测 MIUI官方表示,以上是已经开始适

关于 Android 7.0 适配中 FileProvider 部分的总结

原文地址:http://yifeng.studio/2017/05/03/android-7-0-compat-fileprovider/ 由于 Android 7.0 或更高版本的系统在国内手机市场上的占比不是很高,很多 Android 开发人员并没有做 7.0 适配工作,同时测试人员也容易忽视这方面的兼容问题.这导致 7.0 及以上版本的手机用户在使用到应用部分功能时可能出现 App 崩溃闪退.其中,大部分原因都是由项目中使用到 file:// 类型的 URI 所引发的.本文我们便来一探究竟

Android WebApp &amp; NativeApp 适配测试自动化平台GoGo实现 东海陈光剑

Android WebApp & NativeApp 适配测试自动化平台GoGo实现 东海陈光剑 2014年3月6日 18:27:55 源代码: https://github.com/universsky/AndroidAutomationTestUniverssky.git GoGo平台架构: 运行结果: http://10.73.72.122:88/report.html?run_stamp=20140306052855&sec=336&min=5 http://10.125.

我们来一探究竟 Android 7.0 适配中 FileProvider 部分

本文标签: Android7.0 FileProvider 由于 Android 7.0 或更高版本的系统在国内手机市场上的占比不是很高,很多 Android 开发人员并没有做 7.0 适配工作,同时测试人员也容易忽视这方面的兼容问题.这导致 7.0 及以上版本的手机用户在使用到应用部分功能时可能出现 App 崩溃闪退.其中,大部分原因都是由项目中使用到 file:// 类型的 URI 所引发的.本文我们便来一探究竟. Android 7.0 权限变更 为了提高私有目录的安全性,防止应用信息的泄

Android 7.0 适配中 FileProvider 部分总结

本文标签: Android7.0 FileProvider 由于 Android 7.0 或更高版本的系统在国内手机市场上的占比不是很高,很多 Android 开发人员并没有做 7.0 适配工作,同时测试人员也容易忽视这方面的兼容问题.这导致 7.0 及以上版本的手机用户在使用到应用部分功能时可能出现 App 崩溃闪退.其中,大部分原因都是由项目中使用到 file:// 类型的 URI 所引发的.本文我们便来一探究竟. Android 7.0 权限变更 为了提高私有目录的安全性,防止应用信息的泄

Android Gradle插件用户指南(译)

Android Gradle插件用户指南(译) 原文Gradle Plugin User Guide - Android Tools Project Site samples see bottom of New Build System 参考Gradle For Android Training Course 1 简介 这篇文档是基于0.9版本的Gradle插件,1.0以前的版本由于不兼容,可能会有所不同 1.1 新的构建系统的目标 新构建系统的目标是: 使得代码和资源的重用更加简单 使得创建同

Android界面设计适配不同屏幕的尺寸和密度解读

Android是运行在各种提供不同的屏幕尺寸和密度的设备.Android系统提供跨设备的统一开发环境和处理大部分的工作,以调整每个应用程序的用户界面,以在其上显示的画面. 同时,该系统提供了API,允许您控制您的应用程序的UI特定的屏幕尺寸和密度,以优化你的用户界面设计,不同的屏幕配置.作为设计师也要最大程度地为所有设备的体现良好的用户体验或是方便使用阅读,而不是简单地拉伸以适应屏幕上的设备. 25学堂跟大家分享这篇Android界面设计适配不同屏幕的尺寸和密度的问题.有几个知识点需要解读下.

金三银四,磨砺锋芒;剑指大厂,扬帆起航(最全Android开发工程师面试指南)

引言 元旦匆匆而过,2020年的春节又接踵而来,大家除了忙的提着裤子加班.年底冲冲冲外,还有着对于明年的迷茫和期待! 2019年有多少苦涩心酸,2020年就有更多幸福美好,加油,奥利给!怀着一颗积极向上的心,来面对未来每一天的挑战! 所谓"兵马未动,粮草先行",我们打响明天的战役也需要精神食粮来做后勤保障才是. 在此我整理了一份安卓开发面试指南,希望对磨砺锋芒.奋发向上的小伙伴有所帮助,祝你早日剑指大厂,扬帆起航,奥利给! Java基础 Java集合框架 Java集合--ArrayLi

Android实习生 &mdash;&mdash; 屏幕适配及布局优化

为什么要进行屏幕适配.对哪些设备进行适配?在近几年的发展当中,安卓设备数量逐渐增长,由于安卓设备的开放性,导致安卓设备的屏幕尺寸大小碎片化极为严重.从[友盟+]2016年手机生态发展报告H1中看截止16年手机分辨率使用情况:Android设备720p和1080p是主流,如果对前5中Android设备分辨率进行适配就能让app在90%的安卓设备上比较美观的兼容. 涉及重要概念及关系 1.硬件属性 ── 屏幕尺寸.屏幕分辨率.屏幕像素密度 [屏幕尺寸]:屏幕对角线长度.单位是英寸,1英寸=2.54厘