主題: 解決方案解決的問題描述
不同安卓版本兩個可能導緻程序奔潰問題的解決方案 |
安卓設備 |
适用範圍: 哪些型号/技術/平台适用該解決方案
解決方案: 具體的解決方案内容
1.安卓程序基于安卓6.0之前的版本開發,需要運行在我們安卓7或者8版本的設備上。自Android 6.0開始,Google開始對系統權限做出嚴格的要求,有些權限必須用戶同意才能調用相應功能,所以開發者需要調用權限申請的代碼,彈出一個小窗口,向用戶動态申請權限。 以下是動态申請文件讀寫權限的過程: 1.1 讀與寫的權限先定義到靜态字符數組中: private static String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; 1.2 首先判斷當前系統是否是Android6.0(對應API 23)以及以上,如果是則判斷是否含有了寫文件的權限,如果沒有則調用動态申請權限的代碼,ActivityC ompat.requestPermission方法的第一個參數是目标Activity,填寫this即可,第二個參數是String[]字符數組類型的權限集,第三個即請求碼: if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this,PERMISSIONS_STORAGE,REQUEST_PERMISSION_CODE ); } } 1.3 回調函數,申請權限後回調onRequestPermissionResult函數,第一個參數為請求碼,第二個參數
是剛剛請求的權限集,第三個參數是請求結果,0表示授權成功,-1表示授權失敗: @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNullint[]grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_PERMISSION_CODE) { for (int i = 0; i < permissions.length; i++) { Log.i("MainActivity", "申請的權限為:" + permissions[i] + ",申請結果:"+grantResults[i]); } } } 完整代碼: public class MainActivity extends AppCompatActivity { //讀寫權限 private static String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; //請求狀态碼 private static int REQUEST_PERMISSION_CODE = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE); } } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNullint[]grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_PERMISSION_CODE) { for (int i = 0; i < permissions.length; i++) { Log.i("MainActivity", "申請的權限為:" + permissions[i] + ",申請結果:" + grantResults[i]); } } } } 2.安卓程序開發在4之前版本,需要運行在安卓4,安卓7,安卓8的設備上 有些早期開發的程序,可能會把藍牙通訊,網絡通訊都寫在主線程中(非常不好的編程習慣,但是也有軟件這樣寫),這時候如果運行在我們的安卓設備上,程序會奔潰。 解決方案:将通訊動作寫在子線程中就可以。 |
杭州奇捷科技有限公司
銷售經理:劉凱龍 19967480500
銷售經理:楊麗 15180325332
座機:0571-86618313
地址:浙江省杭州市莫幹山路1418-5号 互動V谷2幢2006室