1. 程式人生 > >專案android 6.0,7.0 版本適配問題

專案android 6.0,7.0 版本適配問題

之前專案沒有考慮到android 6.0 及以上版本的適配問題,後來再APP中加百度lbs地圖時,遇到華為榮耀8定位不了的問題。
1 android 6.0以上的部分危險許可權需要通過執行時動態申請。
2 android 6.0對應的api 23,將android編譯版本換成23,才可以找到@TargetApi(value = Build.VERSION_CODES.M) Build.VERSION_CODES.M表示android 6.0
3 之前把最低版本設為api 16,發現程式碼中指定編譯版本為android 6.0 也即Build.VERSION_CODES.M時找不到,將編譯api改為23後,出現一些相容錯誤。例如:
(1) android sdk 23,Google 移出了Apache HttpClient相關的類,推薦使用HttpUrlConnection,如果需要繼續使用Apache HttpClient,需要在libs中新增org.apache.http.legacy.jar
和HttpClient一樣,HttpResponse類也被移除了,解決方法如上所述,jar檔案位置在sdk目錄下\platforms\android-23\optional資料夾中
(2) android 6.0 The method sin(float) is undefined for the type FloatMath 報錯
Android6.0使用 Math.floor 代替 FloatMath.floor 即可
(3) The method initializeScrollbars(TypedArray) is undefined for the type PLA_AbsListView
initializeScrollbars android 6.0中該方法不存在,使用反射機制找到被遮蔽

 final TypedArray a = context.getTheme().obtainStyledAttributes(new int[0]);
        try {
            // initializeScrollbars(TypedArray)
            Method initializeScrollbars = Android.view.View.class.getDeclaredMethod("initializeScrollbars", TypedArray.class);
            initializeScrollbars.invoke(this
, a); } catch (Exception e) { e.printStackTrace(); }

4 公司測試機比較少,也就後來才用高版本的手機測試,像華為榮耀8只開啟app定位許可權不夠,還需要檢測總開關定位服務有沒有開啟,如果沒有開啟總開關,檢測定位許可權都是無效的。所以首先檢測總定位服務有沒有開啟。

/** 
     * 判斷GPS是否開啟,GPS或者AGPS開啟一個就認為是開啟的 
     * @param context 
     * @return true 表示開啟 
     */  
    public
static final boolean isOPenLocService(final Context context) { LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); // 通過GPS衛星定位,定位級別可以精確到街(通過24顆衛星定位,在室外和空曠的地方定位準確、速度快) boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); // 通過WLAN或行動網路(3G/2G)確定的位置(也稱作AGPS,輔助GPS定位。主要用於在室內或遮蓋物(建築群或茂密的深林等)密集的地方定位) boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (gps || network) { return true; } return false; } if(TyhcApplication.isOPenLocService(this)){ // 先彈出提示框 pumpCallDialog(); }else{ final Dialog pumpDialog = Custom_dialog.pumpDialog(this, "溫馨提示", "手機定位服務未開啟,不能定位", "取消", "開啟位置服務"); Custom_dialog.setConfirmListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub pumpDialog.dismiss(); //開啟定位服務總開關介面 Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); } }); Custom_dialog.setCancleListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub pumpDialog.dismiss(); } }); } protected void pumpCallDialog() { final Dialog dialog1 = Custom_dialog.pumpDialog(this, "門店定位", "請手持手機,站在門店正中央位置進行精準定位", "取消", "開始定位"); Custom_dialog.setCancleListener(new OnClickListener() { @Override public void onClick(View v) { dialog1.dismiss(); } }); Custom_dialog.setConfirmListener(new OnClickListener() { @Override public void onClick(View v) { PermissionGen.needPermission(ApplyChildShopActivity.this, 100, android.Manifest.permission.ACCESS_FINE_LOCATION); dialog1.dismiss(); } }); } @PermissionSuccess(requestCode = 100) public void startLocation() { locationService.start();// 定位SDK } / @PermissionFail(requestCode = 100) public void failApply() { Toast.makeText(this, "定位許可權獲取失敗", Toast.LENGTH_SHORT).show(); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults); } 上面只是定位許可權開啟,後來模仿百度地圖一樣,在歡迎頁就開始檢測app中需要的許可權是否開啟,儲存許可權必須開啟才能進入app if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ||ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED ||ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED ||ContextCompat.checkSelfPermission(this, android.Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { pumpDialog(); } else { 進入首頁 } Dialog dialog = null; public void pumpDialog() { View view = View.inflate(this, R.layout.dialog_permission, null); dialog = new Dialog(this, R.style.transparentFrameWindowStyle); dialog.setContentView(view, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); Window window = dialog.getWindow(); window.setGravity(Gravity.CENTER); WindowManager.LayoutParams wl = window.getAttributes(); wl.dimAmount = 0.3f; wl.gravity = Gravity.CENTER; wl.width = ViewGroup.LayoutParams.WRAP_CONTENT; wl.height = ViewGroup.LayoutParams.WRAP_CONTENT; // 設定顯示位置 dialog.onWindowAttributesChanged(wl); // 設定點選外圍解散 dialog.setCanceledOnTouchOutside(true); dialog.show(); dialog.getWindow().setAttributes(wl); dialog.getWindow().setFlags( WindowManager.LayoutParams.FLAG_BLUR_BEHIND, WindowManager.LayoutParams.FLAG_BLUR_BEHIND); Button btn_next = (Button) view.findViewById(R.id.btn_next); btn_next.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PermissionGen .with(SplashActivity.this) .addRequestCode(100) .permissions(android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.CAMERA, android.Manifest.permission.READ_CONTACTS, android.Manifest.permission.CALL_PHONE).request(); dialog.cancel(); } }); } @PermissionSuccess(requestCode = 100) public void readPreference() { //進入首頁 } @PermissionFail(requestCode = 100) public void failRead() { } private void pumpStorage() { final Dialog pumpDialog = Custom_dialog.pumpDialog(this, "溫馨提示", "儲存許可權是必須的,否則APP無法讀取執行所需的儲存檔案", "取消", "確定"); Custom_dialog.setConfirmListener(new View.OnClickListener() { @Override public void onClick(View v) { pumpDialog.cancel(); PermissionGen.needPermission(SplashActivity.this, 100, android.Manifest.permission.READ_EXTERNAL_STORAGE); } }); Custom_dialog.setCancleListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub pumpDialog.dismiss(); finish(); } }); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { for (int i = 0; i < permissions.length; i++) { if ("android.permission.READ_EXTERNAL_STORAGE" .equals(permissions[i]) && grantResults[i] == -1) { //如果儲存許可權沒開啟 pumpStorage(); break; } } PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults); }

5 android 6.0 引入的是動態許可權限制,android 7.0則是“私有目錄被限制”

相關推薦

專案android 6.0,7.0 版本問題

之前專案沒有考慮到android 6.0 及以上版本的適配問題,後來再APP中加百度lbs地圖時,遇到華為榮耀8定位不了的問題。 1 android 6.0以上的部分危險許可權需要通過執行時動態申請。 2 android 6.0對應的api 23,將an

Android apk升級 相容6.0 7.0版本 華為手機

上篇部落格寫了用DownloadManager,進行下載,結果發現有些手機並不能相容,查詢原因是DownloadManager.Request 的setDestinationInExternalPublicDir()函式問題,這直接根源掛鉤,Request 有個

Android 拍照和相簿功能(Android 6.07.0系統和華為機型問題)

眾所周知,呼叫相機拍照和相簿中獲取圖片的功能,基本上是每個程式App必備的。 實現適配Android每個版本,國內手機,要處理的問題卻也不少。例如:Android6.0許可權問題,Android7.0 FileProvider問題,華為手機相簿獲取不到圖片的問

android 6.0 7.0 8.0 在Service中彈出對話方塊

在網上找了很多文章大家都再說8.0的懸浮窗許可權不開想要彈出對話方塊就要使用WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY然而我的在華為8.0 p

mac下更新自帶的PHP版本到5.67.0

script 需要 export mil 配置 install bin pan pat 下載和安裝PHP 5.6 打開終端並且運行如下命令: curl -s http://php-osx.liip.ch/install.sh | bash -s 5.6 然後,PHP

Android 呼叫相機、相簿(6.0

又好久沒有寫部落格了,好習慣不能斷,該寫點就得寫點,今天帶來的筆記是關於Android 專案呼叫系統相機 與呼叫系統相簿的之後拿到照片的基本操作,我感覺好多人還是不太熟悉的哈。專案相容 Android 5.0裝置、Android 6.0裝置、Android 7.0、Android 8.0

Android 6.0 / 7.0 / 8.0 的APK安裝

Android 1.x~6.x APK安裝 關於 android 7.0 之前的 apk安裝,需要注意設定 Intent.FLAG_ACTIVITY_NEW_TASK 就好 Intent intent = new Intent(Intent.ACTION_VIEW);

android 下載apk後安裝apk(android 7.0)

    為適配7.0以後系統,首先需要在AndroidManifest.xml檔案中application節點下定義provider,如下:   <provider          android:nam

unity+android:大版本更新安裝下好的apk,相容任意安卓5.0,7.0,8.0版本

Android Studio 1:在專案的res目錄下建立xml目錄,再建立file_paths.xml檔案。 <?xml version="1.0" encoding="utf-8"?> <paths> <root-pa

解決方案之Android 國際化資源完美相容6.0,7.0,8.0

在Android世界中,一般App應用的語言是根據Android系統顯示的語言變化的,但是有時候有些應用需要單獨設定App的顯示語言。 Android 國際化實現 國際化一般最常用的是支援簡體中文和美式英文。 思路: 切換Project檢視 建立多個國家的資原始

Android 關於6.0,7.0許可權的那點事

前言:最近把專案 targetSdkVersion 從22直接升級到27,因此就需要對新的動態許可權相關問題進行一籮筐的操作。寫這篇文章總結一下。 我在專案裡用的是EasyPermission工具類進行的動態許可權判斷。首先,在build.gradle中新增依賴: imp

碩思閃客精靈6.0破解版(含7.0破解補丁)6.0/7.0/8.0/9.0版本

碩思閃客精靈6.0破解版(含7.0破解補丁)6.0/7.0/8.0/9.0版本,他可以幫助你把網上下載的FLASH進行反編。 碩思閃客精靈破解版下載 碩思閃客精靈註冊碼版下載 然後通過flash專業進行編輯,改成自己想要的畫面或者文字以及連結等。他能夠輕鬆反編譯一個或是多個SWF格式檔案為FLA/FLE

Android 6.0 7.0及以上 動態許可權

android 6.0版本開始,google粑粑處於安全性考慮,敏感的許可權只在manifest註冊已經不可以了(例如攝像頭許可權,定位許可權等等),需要在程式碼中動態註冊。 以下對許可權做一些介紹(轉載): 以下是需要單獨申請的許可權,共分為9組,每組只要有一個許可權申

android 6.0, 7.0之動態申請許可權完美解決方案

android 7.0 動態申請許可權工具類 對於實際開發的程式原來說,對許可權申請肯定不會陌生.由於android 6.0 之後有些許可權不僅需要在 mainfest中註冊,

Android 5.0 6.0 7.0新特性

Android在5.0:最主要的一個特性就是加入了RecycleView這個元件,可以替代ListView和GridView ,其他的功能就是支援多種裝置,全新的通知中心,多工視窗有了卡片式設計, Android6.0:新特性 主要有許可權管理,支付相關,指紋支援,電池優化等 其他的

MySQL 4.1/5.0/5.1/5.5/5.6/5.7版本的主要區別

mysql的50版本和51版本的區別: 一、5.0 增加了Stored procedures、Views、Cursors、Triggers、XA transactions的支援,增加了INFORATION_SCHEMA系統資料庫。 二、5.1 增加了Event sched

Android 7.0呼叫系統相機筆記

對於Android N以下,檔案直接Uri.fromFile(file)就可以直接使用,Audroid N 即編譯app的版本 compileSdkVersion 24時,此時會報出FileUriExposedException異常,解釋如下: 對於面向 Android

Android圓形頭像設定(實現相機、相簿選擇並裁剪)相容6.0/7.0

Android圓形頭像設定(實現相機、相簿選擇並裁剪)相容Android 7.0/6.0 Android7.0新增了許可權修改、目錄被限制訪問、多視窗 等等,最近在做頭像設定的時候,執行到Android7.0的機子上,拍照和進相簿都報錯:FileUriExpo

C# 6.0/7.0 的新特性

const con use 新特性 小夥伴 必須 switch 寫法 相同 轉眼C#語言都已經叠代到7.0版本了,很多小夥伴都已經把C# 7.0 的新特性應用到代碼中了,想想自己連6.0的新特性都還很少使用,今天特意搜集了一下6.0和7.0的一些新特性,記錄一下,方便查閱。

Centos下Yum安裝PHP 5.5、5.67.0

mbstring eas common mysql 編譯安裝 test .rpm mysq cli Centos系統自帶的php版本很低,如果我們需要使用高版本的php,可以不用編譯安裝,直接用yum安裝會非常省時省力。 1.檢查當前安裝的PHP包yum list inst