智能管家SmartButler

从PT站发现的 Android 练手小项目,慕课网上面的课程,看过视频之后感觉优点还是挺多的

  1. 上手简单
  2. 老师总结一些代码常用模板,有利于之后编程代码结构
  3. 这个框架虽说是 MVC ,但是对于小项目 MVC 也未尝不可,并且框架分类层次分明
  4. 采用许多开源框架

缺点

  1. 最重要的,年代稍微有些老,对于新版本(Android6.0 之后不太友好)
  2. 虽然采用了许多开源框架,但是对于框架本身并没有做太多的说明,只是轮子的拼接
  3. 部分后台接口发生改变,用不了

做了一些微小的工作

对于这个练手项目,肯定是要抱着学习的态度,但同时,还要结合现在新版本来看旧版代码的一些局限性,
自己只能做一些微小的工作

那么接下来,先从很尴尬的运行时权限说起

运行时权限

在 Android6.0 之前,安装软件时,会告诉你该软件都需要什么什么权限,但是就算软件告诉你我要你各种隐私,你装个微信还是要装对吧,所以Android6.0很机智的引入了运行时权限这个概念,有些关键性的权限,你在AndroidManifest文件里面声明了,没有用,等到用的时候你还要申请一遍,而且会直接弹出询问UI。

这个申请的操作,是留给开发者去做的。

下面来讨论运行时权限在智能管家的应用

拍照与写入内存

调用拍照代码中,我们加入版本检测,并在高版本中引入权限请求

1
2
3
4
5
6
7
8
9
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//如果在Android7.0以上,使用FileProvider获取Uri
intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(getActivity(), getActivity().getPackageName()+".fileprovider", tempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);
Log.e("getPicFromCamera", contentUri.toString());
} else { //否则使用Uri.fromFile(file)方法获取Uri
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
}

在这里引入了FileProvider,我们已经在配置文件中声明了

1
2
3
4
5
6
7
8
9
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.smartbutler.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>

首先,FileProvider 是什么?这个我将在后面博客详细说明,
那么为什要引入呢?
如果我知道一个文件的uri,是不是就可以随意访问了呢?如果没有FileProvider拦着你,确实是这样,但现在更严格了,Android 7.0后新增了对文件跨进程访问的限制,这个限制会造成,如果使用file://uri的方式访问,则会出现android.os.FileUriExposedException的异常。

注意,配置文件中的 "@xml/provider_paths",

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
path="com.example.smartbutler" name="images" />
<root-path
name="root_path"
path="." />
</paths>