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
@RuntimePermissions
public class MainActivity_App extends BaseFragmentActivity {
@Override
public 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")
@Override
public void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// 代理權限處理到自動生成的方法
MainActivity_AppPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
}
這樣就可以了。