android o适配参数,FitAndroidO

FitAndroid7

一行代码完成Android 7 FileProvider适配~

适配FileProvide需要声明provider,编写xml,以及在代码中做版本适配等...

可以抽取一个小库简化这些重复性操作,避免重复声明provider,编写xml,以及在代码中做版本适配...

fork 自 hangyangAndroid

适配androidx 增加AndroidO 安装apk 未知来源 权限

使用

compile 'com.mhy.base:fileprovider:1.0.0'

通过FileProvider7这个类完成uri的获取即可,例如:

FileProvider7.getUriForFile

FileProvider7.setIntentDataAndType

FileProvider7.setIntentData

示例一 拍照

private static final int REQUEST_CODE_TAKE_PHOTO = 0x110;

private String mCurrentPhotoPath;

public void takePhotoNoCompress(View view) {

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

if (takePictureIntent.resolveActivity(getPackageManager()) != null) {

String filename = new SimpleDateFormat("yyyyMMdd-HHmmss", Locale.CHINA)

.format(new Date()) + ".png";

File file = new File(Environment.getExternalStorageDirectory(), filename);

mCurrentPhotoPath = file.getAbsolutePath();

// 仅需改变这一行

Uri fileUri = FileProvider7.getUriForFile(this, file);

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

startActivityForResult(takePictureIntent, REQUEST_CODE_TAKE_PHOTO);

}

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_TAKE_PHOTO) {

mIvPhoto.setImageBitmap(BitmapFactory.decodeFile(mCurrentPhotoPath));

}

// else tip?

}

示例二 安装apk

//检android O 安装未知来源

private static final int INSTALL_PACKAGES_REQUESTCODE = 10011;

private static final int GET_UNKNOWN_APP_SOURCES = 10012;

private void checkAndroidO() {//有读写权限情况下 判断 未知应用

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { //系统 Android O及以上版本

//是否需要处理未知应用来源权限。 true为用户信任安装包安装 false 则需要获取授权

boolean canRequestPackageInstalls = getPackageManager().canRequestPackageInstalls();

if (canRequestPackageInstalls) {

installApk();

} else {

//请求安装未知应用来源的权限

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.REQUEST_INSTALL_PACKAGES}, INSTALL_PACKAGES_REQUESTCODE);

}

} else { //直接安装流程

installApk();

}

}

public void installApk(View view) {

File file = new File(Environment.getExternalStorageDirectory(),

"testandroid7-debug.apk");

Intent intent = new Intent(Intent.ACTION_VIEW);

// 仅需改变这一行

FileProvider7.setIntentDataAndType(this,

intent, "application/vnd.android.package-archive", file, true);

startActivity(intent);

}

Android Q 方面还是使用READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 作为面向用户的存储相关运行时权限,但是现在即使有了这些权限任然无法读取外部储存。

公共目录:Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones 等

公共目录下APP卸载后不会删除。

APP 可以通过 SAF(System Access Framework)、MediaStore 接口访问其中的文件。

App-specific 目录

APP 卸载后数据清除。

APP 的私密目录,APP 访问自己的 App-specific 目录时无需任何权限。

Android Q 规定了俩种储存空间一种是Legacy View(传统视图),Filtered View(筛选视图)。

Filtered View(筛选视图)

App可以直接访问App-specific目录,但不能直接访问App-specific外部目录,访问公共目录或者其他App的App-soecific需通过MediaStore,SAF(系统访问框架的缩写),或者其他App提供的ContextPrivate,FileProvider 等访问。

Legacy View(传统视图)

Android Q  兼容旧版本申请权限后App可以访问外部储存,拥有完成的访问权限。

在Android Q 上 tatget  SDK 大于或者等于 29 那么就会默认App赋予Filtered View,小于的话就是Legacy View,也就是小于的话如上Legacy View(筛选视图) 兼容以前,大于只能通过制定的方式访问,划重点啦。App可以在AndroidManifest.xml中进行设置新的属性requestLegacyExternalStorage,来修改外部存储空间视图模型,true为 Legacy View,false 为 Filtered View。

以为就这点不你错了还有,Android Q 还对查询,读写文件的操作上做了改动,比如我们的图片中的地理位置不在默认提供给我们,查询MediaProvider 获得的DATA字段不在可靠,新增文件pending状态, 并且在文件访问的时候DATA目录废弃,假如判断一个文件是否存在那么不应该使用DATA比较那样是不可靠的,应该使用MediaStore 接口或者SAF获取文件的Uri后利用Uri打开FD或者输入输出流,不能转换文件路径进行比较。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值