Android 6.0動(dòng)態(tài)獲取權(quán)限 位置

Android6.0 以上手機(jī)在獲取一些權(quán)限時(shí)候怎炊,不像23以下的機(jī)型,只需要在AndroidManifast文件下進(jìn)行配置就好了廓译,如果你設(shè)置了targetSdkVersion >23 结胀,則需要在運(yùn)行時(shí)動(dòng)態(tài)獲取相應(yīng)權(quán)限,下面方法類可以直接使用
//XPermissionUtils
public static int PHONE = 0x00;//電話
    public static int LOCATION = 0x01;//位置
    public static int CAMERA = 0x02;//相機(jī)
    public static int AUDIO = 0x03;//語音
    public static int EXTERNAL = 0x04;//存儲(chǔ)

    private static int mRequestCode = -1;

    private static OnPermissionListener mOnPermissionListener;

    public interface OnPermissionListener {

        void onPermissionGranted();

        void onPermissionDenied();
    }

    @TargetApi(Build.VERSION_CODES.M)
    public static void requestPermissions(Context context, int requestCode
            , String[] permissions, OnPermissionListener listener) {
        if (context instanceof Activity) {
            mOnPermissionListener = listener;
            List<String> deniedPermissions = getDeniedPermissions(context, permissions);
            if (deniedPermissions.size() > 0) {
                mRequestCode = requestCode;
                ((Activity) context).requestPermissions(deniedPermissions
                        .toArray(new String[deniedPermissions.size()]), requestCode);

            } else {
                if (mOnPermissionListener != null)
                    mOnPermissionListener.onPermissionGranted();
            }
        } else {
            throw new RuntimeException("Context must be an Activity");
        }
    }

    /**
     * 獲取請求權(quán)限中需要授權(quán)的權(quán)限
     */
    private static List<String> getDeniedPermissions(Context context, String... permissions) {
        List<String> deniedPermissions = new ArrayList<>();
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED) {
                deniedPermissions.add(permission);
            }
        }
        return deniedPermissions;
    }

    /**
     * 請求權(quán)限結(jié)果责循,對應(yīng)Activity中onRequestPermissionsResult()方法。
     */
    public static void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (mRequestCode != -1 && requestCode == mRequestCode) {
            if (mOnPermissionListener != null) {
                if (verifyPermissions(grantResults)) {
                    mOnPermissionListener.onPermissionGranted();
                } else {
                    mOnPermissionListener.onPermissionDenied();
                }
            }
        }
    }

    /**
     * 驗(yàn)證所有權(quán)限是否都已經(jīng)授權(quán)
     */
    private static boolean verifyPermissions(int[] grantResults) {
        for (int grantResult : grantResults) {
            if (grantResult != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }
使用簡單粗暴攀操,直接在activity中需要獲取權(quán)限的地方使用即可
 XPermissionUtils.requestPermissions(this, 1, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, new XPermissionUtils.OnPermissionListener() {
                @Override
                public void onPermissionGranted() {
                   //權(quán)限獲取成功院仿,進(jìn)行你需要的操作
                }

                @Override
                public void onPermissionDenied() {
                 //權(quán)限獲取失敗,進(jìn)行你需要的操作
                }
            });

//注意,需要在activity中調(diào)用以下方法
 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        XPermissionUtils.onRequestPermissionsResult(requestCode,permissions,grantResults);
    }
以下是位置獲取的方法類
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.text.TextUtils;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class LocationUtils{
private staticStringTAG="LocationUtil";
public static voidrequestLocation(finalContext context) {
XPermissionUtils.requestPermissions(context,RequestCode.LOCATION, newString[]{
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,}
, newXPermissionUtils.OnPermissionListener() {
@Override
public voidonPermissionGranted() {
startLocation(context);
}
@Override
public voidonPermissionDenied() {
DialogUtil.showAlertDialog(context,"位置");
}
});
}
private static voidstartLocation(Context context) {
//獲取地理位置管理器
LocationManager locationManager = (LocationManager) context.getSystemService(Context
.LOCATION_SERVICE);
//獲取所有可用的位置提供器
List providers = locationManager.getProviders(true);
if(providers ==null)return;
//獲取Location
if(ActivityCompat.checkSelfPermission(context,Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED&& ActivityCompat.checkSelfPermission(context,Manifest
.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
//    ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
//  public void onRequestPermissionsResult(int requestCode, String[] permissions,
//                                          int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
List <String>providerSortList =new ArrayList<>();//對提供者進(jìn)行排序歹垫,gps剥汤、net、passive
if(providers.contains(LocationManager.GPS_PROVIDER)) {
Log.d(TAG,"GPS_PROVIDER");
providerSortList.add(LocationManager.GPS_PROVIDER);
}
if(providers.contains(LocationManager.NETWORK_PROVIDER)) {
Log.d(TAG,"NETWORK_PROVIDER");
providerSortList.add(LocationManager.NETWORK_PROVIDER);
}
if(providers.contains(LocationManager.PASSIVE_PROVIDER)) {
Log.d(TAG,"PASSIVE_PROVIDER");
providerSortList.add(LocationManager.PASSIVE_PROVIDER);
}
String locationProvider ="";
for(inti =0;i < providerSortList.size();i++) {
String provider = providerSortList.get(i);
Log.d(TAG,"正在嘗試:"+ provider);
Location location = locationManager.getLastKnownLocation(provider);
if(location !=null) {
locationProvider = provider;
Log.d(TAG,"定位成功:"+ provider);
saveLocation(location);
break;
}else{
Log.d(TAG,"定位失斉挪摇:"+ provider);
}
}
if(!TextUtils.isEmpty(locationProvider)) {
locationManager.requestLocationUpdates(locationProvider,3000,1,locationListener);
}
}
staticLocationListenerlocationListener=newLocationListener() {
@Override
public voidonStatusChanged(String provider, intstatus,Bundle arg2) {
}
@Override
public voidonProviderEnabled(String provider) {
}
@Override
public voidonProviderDisabled(String provider) {
}
@Override
public voidonLocationChanged(Location location) {
//如果位置發(fā)生變化,重新顯示
saveLocation(location);
}
};
/**
* 保存地理位置經(jīng)度和緯度信息
*/
private static voidsaveLocation(Location location) {
if(location !=null) {
doublelatitude = location.getLatitude();
doublelongitude = location.getLongitude();
Log.d(TAG,"latitude:"+ latitude);
Log.d(TAG,"longitude:"+ longitude);
}
}
}

參考這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吭敢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子暮芭,更是在濱河造成了極大的恐慌鹿驼,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辕宏,死亡現(xiàn)場離奇詭異畜晰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瑞筐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門凄鼻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人聚假,你說我怎么就攤上這事块蚌。” “怎么了膘格?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵峭范,是天一觀的道長。 經(jīng)常有香客問我闯袒,道長虎敦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任政敢,我火速辦了婚禮其徙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喷户。我一直安慰自己唾那,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布褪尝。 她就那樣靜靜地躺著闹获,像睡著了一般。 火紅的嫁衣襯著肌膚如雪河哑。 梳的紋絲不亂的頭發(fā)上避诽,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音璃谨,去河邊找鬼沙庐。 笑死鲤妥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拱雏。 我是一名探鬼主播棉安,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼铸抑!你這毒婦竟也來了贡耽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤鹊汛,失蹤者是張志新(化名)和其女友劉穎蒲赂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柒昏,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凳宙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了职祷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氏涩。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖有梆,靈堂內(nèi)的尸體忽然破棺而出是尖,到底是詐尸還是另有隱情,我是刑警寧澤泥耀,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布饺汹,位于F島的核電站,受9級(jí)特大地震影響痰催,放射性物質(zhì)發(fā)生泄漏兜辞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一夸溶、第九天 我趴在偏房一處隱蔽的房頂上張望逸吵。 院中可真熱鬧,春花似錦缝裁、人聲如沸扫皱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽韩脑。三九已至,卻和暖如春粹污,著一層夾襖步出監(jiān)牢的瞬間段多,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工壮吩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衩匣,地道東北人蕾总。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像琅捏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子递雀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

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