预览

    • 河马过河
    • [android 版本号适配 9.0网络请求方法](http://www.cocoachina.com/articles/29242)
    • 版本更新适配android9.0
    • 动态权限获取

2020年4月20–2020年4月26
日常经验整理,有问题请留言。或者加Q:3131713955

关于我

2020年4月15日

河马过河

https://www.jianshu.com/p/30cf2478182d
简述:里面是作者根据自己的开发经验集锦的链接大全,应该是他认为写的好的:里面包括了:OkHttp3-拦截器、retrofit2.0使用、抓包工具Fiddler、微信小程序控件等,满满的干货。唯一的缺点就是在介绍:性能优化文章 时候,链接过长。避免看起来冗长,建议给文字设置超链接。

2020年4月16日

android 版本号适配 9.0网络请求方法

http://www.cocoachina.com/articles/29242里面有种方法比较适用。

为什么要适配网络请求:在9.0中默认情况下启用网络传输层安全协议 (TLS),默认情况下已停用明文支持。也就是不允许使用http请求,要求使用https。
AndroidManifest.xml中的application添加:

<?xml version="1.0" encoding="utf-8"?><manifest ... >    <application android:networkSecurityConfig="@xml/network_security_config">            ...    </application></manifest>

为了安全灵活,我们可以指定支持的http域名:

<?xml version="1.0" encoding="utf-8"?><network-security-config><!-- Android 9.0 上部分域名时使用 http -->    <domain-config cleartextTrafficPermitted="true">        <domain includeSubdomains="true">secure.example.com</domain>        <domain includeSubdomains="true">cdn.example1.com</domain>    </domain-config></network-security-config>

2020年4月20日
参考资料
应用更新适配android9.0
android动态权限获取

版本更新适配android9.0

首先应该知道android9.0包括自身以及以上的版本都需要做权限适配。对于用户来说提高了安全,对于程序员来说,增加了不少的工作量。
1、适配android9.0,当时我的任务是应用更新版本的时候进行适配。如果没有适配的话,无法安装应用,有时候下载也会失败。
步骤:

  • AndroidManifest.xml
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/><uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

第一个权限必须加上,至于第二个,根据需要,假如项目中有webView控件的时候,使用这个权限不会出现加载错误的问题

<provider       android:name="android.support.v4.content.FileProvider"       android:authorities="${applicationId}.fileprovider"       android:grantUriPermissions="true"       android:exported="false">       <meta-data           android:name="android.support.FILE_PROVIDER_PATHS"           android:resource="@xml/file_paths"/></provider>
  • 1、其中,假如你的项目是androidx的那么android:name就改成androidx
  • 2、至于 android:authorities,可以任意给定,相当于布局文件的控件的name,一般是"包名.fileprovider",我这里的${applicationId}就是指的包名。
  • 3、至于android:resource,在res文件夹下面新建xml文件,并创建file_paths.xml.

file_paths.xml

<?xml version="1.0" encoding="utf-8"?><paths>    <root-path        name = "root_path"        path = "."/>    <external-cache-path name="cache_download" path="download"/></paths>

可以根据需要酌情设置,也可以按照这个配置,万能的。

然后就是最重要的一步。
自动安装应用的工具类 autoInstallApk.class

例如,我的项目是在下载文件完成之后进入安装界面。

@Override    public void onSuccess(File result) {        AppUtil.autoInstallApk(context, result);        dismiss();    }

下载成功的回调方法,在这里调用跳转安装界面。

public class AppUtil {/*    * 适配android 9.0 自动安装apk    * */    public static void autoInstallApk( Context context, File file ) {        Intent intent = new Intent(Intent.ACTION_VIEW);        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        Uri contentUri = getUriForFile(context, file);        if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {            // 声明需要的临时的权限            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);        }        intent.setDataAndType(contentUri, "application/vnd.android.package-archive");        context.startActivity(intent);    }    /**     * 将文件转换成uri(支持7.0)     *     * @param mContext     * @param file     * @return     */    public static Uri getUriForFile(Context mContext, File file) {        Uri fileUri = null;        if (Build.VERSION.SDK_INT >= 24) {            fileUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", file);        } else {            fileUri = Uri.fromFile(file);        }        return fileUri;    }}

已经做了适配,直接调用就行。
上面我遇到一个坑,就是运行时权限,getUriForFile(),这个方法在android.v4也有直接调用接口,getUriForFile(mContext, authorities,file),意思是还需要加上android:authorities的值,就是之前随便定义的。我直接将“${applicationId}.fileprovider”写上去,同样报错,无法安装。看来是在java文件中无法直接使用这种获取值方法。

动态权限获取

(做个大标题,比较显眼)

<application...android:usesCleartextTraffic="true"></application>

这是比较强制的使用,也可以添加

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

但是上面的都必须设置targetSdkVersion26以上才生效。

Build.gradle
添加依赖库

//4,permissionsdispatcher权限    implementation'com.github.hotchemi:permissionsdispatcher:3.3.1'    annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:3.3.1'

然后在你需要动态注册的地方,追溯到Activity层,比如,你是在一个更新下载窗口UpdateApplicationDialog.class需要动态获取权限,那你这就需要找到最终调用他的activity。因为动态获取权限在非view层,比如工具类、窗口类,是不能动态权限注册的。(理解就行,不影响后面的操作,只要知道在你的activity进行下面操作就行)

  • MainActivity_App.class
 @RuntimePermissionspublic class MainActivity_App extends BaseFragmentActivity  {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main_app);MainActivity_AppPermissionsDispatcher.onResumeWithPermissionCheck(this);}@Override@NeedsPermission({Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.REQUEST_INSTALL_PACKAGES})protected void onResume() {super.onResume();//在这里获取动态权限(入口),进去之后就是窗口类(这个只是使用例子,调用入口根据实际情况使用)        URL.CheckUpdate(this, getResources().getString(R.string.app_down_id), true);}@SuppressLint ("NeedOnRequestPermissionsResult")@Overridepublic void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);// 代理权限处理到自动生成的方法MainActivity_AppPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);}}

这样就可以了。

更多相关文章

  1. Android动态改变控件的位置
  2. 滁州学院首页获取新闻列表
  3. 【原创】android 实现气泡式listview
  4. Android获得Root权限
  5. Android拍照功能——TakePhoto
  6. Android应用程序申请系统管理员权限
  7. android获取空间的宽度高度 的方法
  8. android 情景模式之响铃+震动获取方法
  9. Android(安卓)Fragment 申请权限 onRequestPermissionsResult 不

随机推荐

  1. Android(安卓)AIDL进程通信机制详解
  2. Android(安卓)TextView内容居中和控件居
  3. java.lang.RuntimeException: Unable to
  4. Android中有关Handler的使用(三)
  5. Android(安卓)8.0以上获取设备序列号解决
  6. Android(安卓)Bundle类
  7. Android(安卓)加快编译时间
  8. Android(安卓)自动化测试—robotium(五)Spi
  9. Android术语小全,推荐一下(改日在翻译).
  10. Android简易实战教程--第三十九话《简单