精华内容
下载资源
问答
  • 所以适配Q成了当务之急,然鹅网上关于适配的资料少之又少(可能是我太菜了)主要出现的问题:根据图片的绝对路径无法正常加载图片,同时使用File.delete删除也是失效直到我看到oppo开发者平台的开发指南:AndroidQ版本...

    碎碎念

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

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

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

    主要出现的问题:

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

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

    特此记录一下。

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

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

    动态申请:

    private voidcheckPermission() {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 classPhotoBean {privateString path;privateString name;private intID;private longcreateDate;public intgetID() {returnID;

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

    }publicString getPath() {returnpath;

    }public voidsetPath(String path) {this.path =path;

    }publicString getName() {returnname;

    }public voidsetName(String name) {this.name =name;

    }public longgetCreateDate() {returncreateDate;

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

    }

    }

    遍历图片:

    private List mPics = new ArrayList<>();private voidinitData(){

    mPics.clear();

    ContentResolver contentResolver=getContentResolver();

    Uri uri=MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

    Cursor query= contentResolver.query(uri,newString[]{

    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= newPhotoBean();

    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中增加这个方法

    publicUri getUri(){

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

    }

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

    public staticUri 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 (newFile(path).exists()) {

    ContentValues values= newContentValues();

    values.put(MediaStore.Images.Media.DATA, path);returncontext.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 voiddeleteUri(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.即对于图片的修改、删除操作都需要用户的允许,即也是一种权限,故需要抛出该异常并去申请获得该权限。

    如图所示:

    f8e7f6e44db9bb02bb9e5ac0ef05acdd.png

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

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

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

    展开全文
  • Google发行Android Q版本也有很长一段时间了,华为应用市场已经要求要适配Android Q版本了,所以,我们也要去对Android Q进行适配。先讲一下咱们这节用到的新特性Android Q文件存储机制修改成了沙盒模式,类似于iOS...

    Google发行Android Q版本也有很长一段时间了,华为应用市场已经要求要适配Android Q版本了,所以,我们也要去对Android Q进行适配。

    先讲一下咱们这节用到的新特性

    Android Q文件存储机制修改成了沙盒模式,类似于iOS

    应用只能访问自己沙盒下的文件和公共媒体文件

    如果有想具体了解Android Q新版特效的可以去 官方文档

    我们在这个地方记录一下Android Q版本进行拍照保存到相册的功能。

    权限问题

    Android Q不再需要申请文件读写权限,默认可以读写自己沙盒文件和公共媒体文件。因为相册属于公共媒体文件,所以,Android Q 可以不用 再动态申请权限。但是Android Q以下版本必须要申请权限才可以访问。

    拍照

    图片正常保存

    拍照:Android Q之前版本使用的,将图片保存到指定文件夹,拍照完成后需要通知相册刷新

    拍照代码

    // 拍照存放路径

    File fileDir = new File(Environment.getExternalStorageDirectory(), "Pictures");

    if (!fileDir.exists()) {

    fileDir.mkdir();

    }

    //图片名称

    String fileName = "/IMG_" + System.currentTimeMillis() + ".jpg";

    //跳转到相机

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    Uri uri;

    //适配Android N之后版本

    if (Build.VERSION.SDK_INT >= 24) {

    uri = FileProvider.getUriForFile(this, ImagePickerProvider.getFileProviderName(this), new File(mFilePath));

    } else {

    //适配Android N版本之前

    uri = Uri.fromFile(new File(mFilePath));

    }

    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

    //跳转,需要在onActivityResult进行处理

    startActivityForResult(intent, 1111);

    刷新相册代码

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + mFilePath)));

    以上就是Android Q之前版本通用的拍照代码,有需要的可以直接复制就行

    将图片保存到沙盒内

    沙盒里面操作文件不再需要申请权限

    沙盒中新建文件夹只能再系统指定的子文件夹中新建

    Android Q版本使用,将图片存放到沙盒文件内,图库无法刷新,无法显示

    // 获取图片沙盒文件夹

    File PICTURES = getExternalFilesDir(Environment.DIRECTORY_PICTURES);

    //图片名称

    mFileName = "IMG_" + System.currentTimeMillis() + ".jpg";

    //图片路径

    mFilePath = PICTURES.getAbsolutePath()+"/"+mFileName;

    //跳转到相机

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    Uri uri;

    if (Build.VERSION.SDK_INT >= 24) {

    uri = FileProvider.getUriForFile(this, ImagePickerProvider.getFileProviderName(this), new File(mFilePath));

    } else {

    uri = Uri.fromFile(new File(mFilePath));

    }

    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

    startActivityForResult(intent, 1111);

    这个不用调用代码刷新相册库,因为刷新了也不能显示😁

    仔细对比一下发现这两种基本上没有什么差别,只有文件存放路径不同,因为在Android Q新版本上对存储做出了改变。

    将图片保存到公共文件夹

    //-------------------------

    //拍照存放路径

    //为了适配Android Q版本以下

    File fileDir = new File(Environment.getExternalStorageDirectory(), "Pictures");

    if (!fileDir.exists()) {

    fileDir.mkdir();

    }

    String fileName = "/IMG_" + System.currentTimeMillis() + ".jpg";

    //--------------------------

    //--------------------------

    //设置参数

    Uri uri = null;

    // 设置保存参数到ContentValues中

    ContentValues contentValues = new ContentValues();

    //设置文件名

    contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);

    //兼容Android Q和以下版本

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {

    //android Q中不再使用DATA字段,而用RELATIVE_PATH代替

    //RELATIVE_PATH是相对路径不是绝对路径

    //DCIM是系统文件夹,关于系统文件夹可以到系统自带的文件管理器中查看,不可以写没存在的名字

    contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, "DCIM/Pictures");

    } else {

    //Android Q以下版本

    contentValues.put(MediaStore.Images.Media.DATA, mFilePath);

    }

    //设置文件类型

    contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/JPEG");

    //执行insert操作,向系统文件夹中添加文件

    //EXTERNAL_CONTENT_URI代表外部存储器,该值不变

    uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);

    // 若生成了uri,则表示该文件添加成功

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

    startActivityForResult(intent, 1111);

    使用这段代码也不用刷新相册库,会自动刷新。

    存到公共文件的操作,相对来说麻烦点,但是也还好。

    到此这篇关于适配AndroidQ拍照和读取相册图片的实现方法的文章就介绍到这了,更多相关AndroidQ拍照和读取相册图片内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

    本文标题: 适配AndroidQ拍照和读取相册图片的实现方法

    本文地址: http://www.cppcns.com/ruanjian/android/322572.html

    展开全文
  • 7月9日,小米9 Android Q Beta版已开启测试。MIUI官方微博宣布,小米9 Android Q Beta版已开启测试,正在招募尝鲜用户。看名字就可以看出,新系统是基于Android Q打造的全新MIUI。小米Android Q适配机型一览。按照...

    7月9日,小米9 Android Q Beta版已开启测试。MIUI官方微博宣布,小米9 Android Q Beta版已开启测试,正在招募尝鲜用户。看名字就可以看出,新系统是基于Android Q打造的全新MIUI。小米Android Q适配机型一览。

    按照计划,小米9 Android Q将于2019年Q4正式上线。

    小米官方在MIUI论坛发帖公布了能够升级Android Q操作系统的机型名单及其时间,具体如下:

    小米9、Redmi K20 Pro、小米8、小米8探索版、小米8屏幕指纹版、小米MIX2S、小米MIX3、Redmi K20、Redmi Note7、Redmi Note7 Pro、小米9 SE在内的11款机型均能升级Android Q,它们的测试时间最早定在2019年第四季度,最晚是2020年第一季度。

    此前,谷歌曾放出了一些Android Q的信息。

    它最大的特点是大幅度提高了安全性,权限管理系统极为严格。在Android Q中,应用使用任何权限都需要询问用户,用户可以选择授权或不授权、提供或不提供;对于共享文件,用户可以自己控制。

    在最新的Android Q中,谷歌针对大屏设备进行了体验上的优化,同时改进了ART机制,谷歌将部分预先配置好的文件放在云端,以提升应用的加载速度和运行效率,使Android应用整体的流畅度以及稳定性进一步提升。

    底层图形接口方面,Android Q延续推广Vulkan 图形渲染 API接口,还加入了对ANGLE的支持,以提升3D游戏体验。

    拍照方面,从Android Q开始,谷歌将深度图像(景深数据)的访问权限开放给第三方应用。

    网络方面,Android Q会自动将用户手动断开连接的Wi-Fi网络列入黑名单24小时,在此期间,即便是删掉该网络重新登录,也无法自动连接该网络,直至24小时之后。

    除了上述的更新之外,此次升级谷歌重点加强了Android Q 系统的隐私保护力度,包括像基于文件的加密、摄像头/麦克风权限访问、备份加密等等。

    此外Android Q还针对系统操作方面进行了改进,比如手势、分屏一些常用功能。

    展开全文
  • IT之家3月14日消息 谷歌在美国当地时间3月13日(北京时间14日凌晨)正式推送了Android Q的首个Beta版本,“亲儿子”Pixel系列全系手机可以尝鲜体验这最新的系统。在新版本系统当中,谷歌为安卓系统带来了官方的桌面...

    IT之家3月14日消息 谷歌在美国当地时间3月13日(北京时间14日凌晨)正式推送了Android Q的首个Beta版本,“亲儿子”Pixel系列全系手机可以尝鲜体验这最新的系统。在新版本系统当中,谷歌为安卓系统带来了官方的桌面模式。

    719244f5f8da38affd8644fe70c392e5.png

    图源:XDA

    Twitter用户@Shad0wKn1ght93注意到AOSP Launcher有一个新的组件,在启动时会启动一个新的Android桌面界面。当用户连接到更大的显示屏或者在大屏幕中使用时,系统便会呈现一个横向的平板电脑界面,允许用户通过类似于Windows的多任务来使用设备。

    575a65b71b519eeac928e9eb0e143ff8.png

    虽然目前Android Q系统仅向Pixel用户推送,但是普通用户也可以通过Android Studio模拟器来体验这一新特性。用户安装模拟器并下载Android Q系统镜像之后,通过以下ADB命令即可启用全新的AOSP Launcher组件。

    非GMS:adb shell am start -n "com.android.launcher3/com.android.launcher3.SecondaryDisplayLauncher"GMS:adb shell am start -n"com.google.android.apps.nexuslauncher/com.android.launcher3.SecondaryDisplayLauncher"

    更早之前,三星以及华为等安卓智能手机厂商已经在旗下设备中添加类似的模式,当用户把智能手机连接到更大的显示屏时,会呈现新的桌面模式。

    fff8a1393b62cdfc8e9e5203564fb06f.png

    ed26625fdb1ed47433c1c36a7e9503e9.png

    展开全文
  • AndroidQ适配

    2021-06-02 22:47:58
    访问相机信息需要权限 getCameraCharacteristics()如果没有相机权限,有些字段访问可能获取到空值 wifi开关 在Android Q上运行的应用无法通过WifiManager.setWifiEnabled()接口启用或停用Wi-Fi,可以提供面板,让...
  • Android Q & Android 11存储适配(二) FileOperator文件管理框架 分区存储(Scoped Storage) 沙盒存储(App-specific directory) 本应用专有的目录(通过 Context.getExternalFilesDir() 访问) 公共目录...
  • android Q获取SN

    2021-03-05 11:33:04
    Android Q以上Build.getSerial()即使加上权限也不能获取到SN, 然后查看源代码,再打印log,看到frameworks/baseservices/core/java/com/android/server/am/ActivityManagerService.java中有直接获取到serial的另一...
  • 1、降级targetSdkVersion的版本未27以下,但是这会导致你的设备又无法运行在android 10 上了,因此相当于没说。 2、在manifest.xml文件的application标签下添加android:usesCleartextTraffic="true",它的作用是指示...
  • Execution failed for task... Manifest merger failed : Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an inte...
  • 前言最近时间在做AndroidQ的适配,截止到今天AndroidQ分区存储适配完成,期间出现很多坑,目前网上的帖子大部分都是概述变更内容,接下来的几篇帖子都是对分区存储实际经验代码总结,填坑经验,特此记录一下,也为...
  • QFsolution - 适用于AndroidQ的文件操作解决方案适用于AndroidQ的简易图片选择器。基于协程的系统文件选择,系统拍照,系统裁剪。Uri转为File的究极解决方案。开始使用添加依赖allprojects {repositories {maven { ...
  • Android Q即将推出正式版,本文是基于Q接近最终版本的beta6版本作为记录写的,如果对看到本文的人有帮助那当然是更好了。一、Android Q的私有目录这里的私有目录即是 App-specific 目录,具体路径大概是“内部存储...
  • 在大多数平板等设备定制化开发过程中,多数都会要求默认横屏显示,为了实现这个需求,就得从开机动画和系统旋转方向方面解决 实现思路 1.开机动画默认横屏 2.系统旋转方向设置为横屏 1.开机动画 ...
  • 安卓Q中google彻底禁止了第三发应用获取imei,并且mac地址返回的地址也变成了02:00:00:00:00:00。 这是官方给出的解决方案: https://developer.android.com/training/articles/user-data-ids 这是官网的截图: ...
  • android 静默安装apk,适配android Q静默

    热门讨论 2021-02-20 11:55:20
    android 系统下静默安装apk需要时系统级应用 或 加了白名单具备系统权限App; 解决方案 一: 在低版本SDK中应该是SDK4.0(API15)及以下,具体没考证,可以通过PackageManager类的installPackage方法来静默安装; ...
  • AndroidQ 分屏窗口模式 (AMS部分)

    千次阅读 2021-11-22 09:38:23
    Android7.0开始支持多窗口,多窗口分为三种,画中画,分屏,自有窗口,多窗口的核心原理其实就是分栈和设置栈边界, 分栈即把不同窗口模式下的Activity放在不同的ActivityStack中,Android7.0为区分不同...
  • Android Q 方案: 通过SSID匹配,然后对wifi info进行解析,再进行连接。 代码: diff --git a/alps/frameworks/opt/...
  • 前言在上一篇中我们已经讲述了AndroidQ(10)分区存储适配,包括如何在私有目录创建文件及文件夹、公共目录下创建文件夹及文件、公有目录下读取文件、删除文件等重要功能。本篇文章将以开发中的实际情况出发,讲述在...
  • Android10源码查看和下载一 在线...android10 推出来已经有一段时间了,现在手机厂商们最新的手机系统基本都是基于android10了,在此记录下android10的几个源码的获取路径,方便大家研究android10系统。 一 在线查看 ...
  • AndroidQ版本发布已经快一年了 虽然市场使用的占有率还不是太高 但是新手机 5G手机基本搭载的都是AndroidQ 所以AndroidQ的适配已经近在眼前了AndroidQ两大主要变动:1.暗黑模式适配2.私有目录与公共目录文件的交互...
  • 背景有时候我们需要在app启动时去获取用户复制的内容,这时候需要进行剪切板相关操作,而Android Q开始只有系统默认的输入法应用或者应用处于焦点时才能获取到剪切板的数据,经测试只有targetSdkVersion和设备型号均...
  • 原因什么的你们自己去看下,直接推荐一个允许你在AndroidP上使用反射而没有任何限制的库 解决我的问题FreeReflection, 参照文档 添加一行 Reflection.unseal(base); 就ok了
  • android Q 新特性

    2020-12-19 14:10:04
    公共媒体文件的存储后台地理位置权限适配折叠屏全屏手势导航,应用充分利用全面屏,建议应用不要覆盖系统手势,否则可能导致手势冲突,影响用户使用习惯应用使用黑色主题,灵活动态变化Android ...
  • 综述所有内容的访问变化见下图:外部媒体文件的扫描,读取和...一句话介绍 MediaStore,MediaStore 就是Android系统中的一个多媒体数据库。代码如下图所示,以搜索本地视频为例子:protected List doInBackground(...
  • Android Q之前,我们用的方式是通过adb命令:pm install -r实现APK的静默安装。但是在Android Q之后,哪怕拥有了root权限,此方案也行不通了。 新方案 注:新方案要求APP具有系统签名。 首先添加权限: <!--...
  • 前言最近在做App启动自动获取粘贴板的功能时发现,10以上的高版本无法获取剪切板的内容Android Q对剪切板做了改动当应用没有获取到焦点的时候,无法获取剪贴板内容思路既然应用未获取到焦点,所以无法获取到剪切板...
  • Android Q文件存储机制修改成了沙盒模式应用只能访问自己沙盒下的文件和公共媒体文件存储(也就是write)私有目录和公共媒体文件都不需要WRITE_EXTERNAL_STORAGE权限读取 (也就是read)私有目录不需要READ_EXTERNAL_...
  • 4、适配AndroidQ 5、总结 1、分区存储的背景和目的 早期的Android开发,对文件操作缺少限制,只要申请个读写内存权限就可以对整个文件目录随便操作,绝大多数应用都会在根目录建一个自己的文件夹用来存储数据,甚至...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 94,878
精华内容 37,951
关键字:

安卓q吧