1.報錯原因:
在集成百度地圖SDK的時候在手機上無法定位,檢查沒有任何錯誤,最后通過搜索才知道是Android版本為6.0的問題,這是因為在Android6.0采用了運行時權限(RuntimePermissions),Android6.0的權限一般分為兩種,一種時普通權限,可以直接獲取,其它的運行時權限,需要提示用戶手動同意之后,才能獲取。
失敗的原因就是,小米手機MIUI是Android6.0.1,如果不加動態獲取權限的代碼,是不會提示的,沒有得到權限,當然無法定位。
2.解決代碼:
private static final int BAIDU_READ_PHONE_STATE =100; public void showContacts(){ if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { Toast.makeText(getApplicationContext(),"沒有權限,請手動開啟定位權限",Toast.LENGTH_SHORT).show(); // 申請一個(或多個)權限,並提供用於回調返回的獲取碼(用戶定義) ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE}, BAIDU_READ_PHONE_STATE); }else{ init(); } } //Android6.0申請權限的回調方法 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { // requestCode即所聲明的權限獲取碼,在checkSelfPermission時傳入 case BAIDU_READ_PHONE_STATE: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 獲取到權限,作相應處理(調用定位SDK應當確保相關權限均被授權,否則可能引起定位失敗) init(); } else { // 沒有獲取到權限,做特殊處理 Toast.makeText(getApplicationContext(), "獲取位置權限失敗,請手動開啟", Toast.LENGTH_SHORT).show(); } break; default: break; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textureMapView = (TextureMapView) findViewById(R.id.mBaidumapView); //判斷是否為android6.0系統版本,如果是,需要動態添加權限 if (Build.VERSION.SDK_INT>=23){ showContacts(); }else{ init();//init為定位方法 } }
注:本文節選自http://blog.csdn.net/shihao627/article/details/53908436,版權歸其所有。