android定位小結(jié)及6.0以上權(quán)限動態(tài)申請

關(guān)于Android實現(xiàn)定位的問題網(wǎng)上一搜會有很多代碼诡宗,但前段時間在做定位時還是遇到一些坑昙啄,記錄一下吧~

1伍绳、location一直為null

2民镜、權(quán)限動態(tài)申請

定位我們使用的一般有兩種:GPS定位、網(wǎng)絡(luò)定位适肠,GPS定位這里先埋一個坑霍衫,后面會提到。先來看一下我一開始寫的定位代碼:

private void getLocation(Context context) {
    //獲取地理位置管理器
    locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

    if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
        locationProvider=LocationManager.GPS_PROVIDER;
    }else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
        locationProvider=LocationManager.NETWORK_PROVIDER;
    }else {
        // TODO: 2017/12/6 
        ToastUtil.showShort("請打開手機定位~");
    }

    if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return null;
    }
    Location location=locationManager.getLastKnownLocation(locationProvider);
    if (location!=null){
        LogUtil.i("location","經(jīng)緯度:"+location.getLatitude()+"侯养,"+location.getLongitude());
    }
}

代碼運行后得到的location始終為空敦跌,有人說getLastKnownLocation()獲取的是上一次的定位信息,第一次運行為null是可能的逛揩,要做的就是注冊監(jiān)聽器獲取更新的location柠傍,于是添加了如下代碼:

LocationListener locationListener = new LocationListener() {  
    // Provider的狀態(tài)在可用麸俘、暫時不可用和無服務(wù)三個狀態(tài)直接切換時觸發(fā)此函數(shù)
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    // Provider被enable時觸發(fā)此函數(shù),比如GPS被打開
    @Override
    public void onProviderEnabled(String provider) {
    }

    // Provider被disable時觸發(fā)此函數(shù)携兵,比如GPS被關(guān)閉
    @Override
    public void onProviderDisabled(String provider) {
    }

    // 當(dāng)坐標(biāo)改變時觸發(fā)此函數(shù)疾掰,如果Provider傳進相同的坐標(biāo),它就不會被觸發(fā)
    @Override  
    public void onLocationChanged(Location location) {           
        LogUtil.i("location","經(jīng)緯度:"+location.getLatitude()+"徐紧,"+location.getLongitude());
    }  
};  
mLocationManager.requestLocationUpdates(serviceProvider, 10000, 1, this);  

但是静檬,運行后onLocationChanged一直沒有被調(diào)用,仍無法獲取location并级。

所以為什么location一直為null拂檩?

通過打出來的日志我們能看到是通過GPS定位的,GPS定位雖然開啟嘲碧,但是測試時我們身處室內(nèi)稻励,在室內(nèi)GPS是基本定不到位的。
所以在 if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))時我們拿到的locationProvider是gps愈涩,但由于在室內(nèi)所以location一直為null望抽。所以以上代碼邏輯是不完善的。修改后的代碼:

/**
 * 獲取當(dāng)前Location
 */
private Location getLocation(Context context) {
    //獲取地理位置管理器
    locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

    if (!gpsEnabled() && !netWorkEnabled()) {
        ToastUtil.showShort("請打開手機定位~");
    }

    if (gpsEnabled() && getGPSLocation(locationManager) != null) {
        return getGPSLocation(locationManager);

    } else if (netWorkEnabled() && getNetWorkLocation(locationManager) != null) {
        return getNetWorkLocation(locationManager);

    } else {
        return null;
    }

}

private boolean gpsEnabled() {
    return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}

private boolean netWorkEnabled() {
    return locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}

private Location getGPSLocation(LocationManager locationManager) {
    if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return null;
    }
    return locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}

private Location getNetWorkLocation(LocationManager locationManager) {
    if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return null;
    }
    return locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}

判斷GPS定位是否可用且得到的location不為null時履婉,使用GPS定位獲取定位信息煤篙,不成立時則判斷網(wǎng)絡(luò)定位是否可用及其location是否為null,這里就不會出現(xiàn)室內(nèi)GPS可用但無法定位的問題毁腿,在室內(nèi)可使用網(wǎng)絡(luò)定位辑奈。

對于定位服務(wù)關(guān)閉時,我們可以跳轉(zhuǎn)去設(shè)置界面去開啟:

    if (!gpsEnabled() && !netWorkEnabled()) {
        ToastUtil.showShort("請打開手機定位~");
        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);  
        startActivityForResult(intent, 0);  
    }

在onActivityResult中再處理設(shè)置完成返回后的操作已烤。

動態(tài)申請定位權(quán)限問題

6.0以后對于Dangerous Permission類的權(quán)限(一般是涉及到用戶隱私的)鸠窗,需要用戶進行授權(quán),定位權(quán)限就是這一類權(quán)限胯究。

permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION

1稍计、首先在AndroidManifest文件中添加需要的以上兩個權(quán)限。
2裕循、權(quán)限檢查:checkSelfPermission臣嚣,主要用于檢測某個權(quán)限是否已經(jīng)被授予,方法返回值為PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED费韭。當(dāng)返回DENIED就需要進行申請授權(quán)了。

public boolean hasPermission(String... permissons) {

    for (String permisson : permissons) {
        if ((ContextCompat.checkSelfPermission(getContext(),
                permisson) != PackageManager.PERMISSION_GRANTED)) {
            return false;
        }
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        //適配小米機型
        AppOpsManager appOpsManager = (AppOpsManager) getContext().getSystemService(Context.APP_OPS_SERVICE);
        int checkOp = appOpsManager.checkOp(AppOpsManager.OPSTR_FINE_LOCATION, Process.myUid(), getContext().getPackageName());
        if (checkOp != AppOpsManager.MODE_ALLOWED) {
            return false;
        }
    }

    return true;
}

3庭瑰、申請授權(quán):requestPermissions

requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, requestCode);

fragment中用requestPermissions星持,activity中用ActivityCompat.requestPermissions(...),不然不能正確回調(diào)弹灭。
4督暂、權(quán)限申請回調(diào):onRequestPermissionsResult

 @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case REQUEST_LOCATION:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission was granted揪垄,do sth;
            } else {
                // permission denied,
                Toast.makeText(getActivity(), "請授予權(quán)限", Toast.LENGTH_SHORT).show();
            }
            break;     
    }
}

權(quán)限申請的步驟大致就是以上幾步逻翁,如果申請成功就可以繼續(xù)愉(ku)快(bi)的敲你的代碼了饥努。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市八回,隨后出現(xiàn)的幾起案子酷愧,更是在濱河造成了極大的恐慌,老刑警劉巖缠诅,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溶浴,死亡現(xiàn)場離奇詭異,居然都是意外死亡管引,警方通過查閱死者的電腦和手機士败,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褥伴,“玉大人谅将,你說我怎么就攤上這事≈芈” “怎么了饥臂?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長伤锚。 經(jīng)常有香客問我擅笔,道長,這世上最難降的妖魔是什么屯援? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任猛们,我火速辦了婚禮,結(jié)果婚禮上狞洋,老公的妹妹穿的比我還像新娘弯淘。我一直安慰自己,他們只是感情好吉懊,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布庐橙。 她就那樣靜靜地躺著,像睡著了一般借嗽。 火紅的嫁衣襯著肌膚如雪态鳖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天恶导,我揣著相機與錄音浆竭,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛邦泄,可吹牛的內(nèi)容都是我干的删窒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼顺囊,長吁一口氣:“原來是場噩夢啊……” “哼肌索!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起特碳,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤诚亚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后测萎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亡电,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年硅瞧,在試婚紗的時候發(fā)現(xiàn)自己被綠了份乒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡腕唧,死狀恐怖或辖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情枣接,我是刑警寧澤颂暇,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站但惶,受9級特大地震影響耳鸯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜膀曾,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一县爬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧添谊,春花似錦财喳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至所踊,卻和暖如春泌枪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秕岛。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工碌燕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乍赫,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓陆蟆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惋增。 傳聞我的和親對象是個殘疾皇子叠殷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容