android 版本號適配 9.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
 @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);
		}
}

這樣就可以了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章