国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android 原生定位開(kāi)發(fā)(解決個(gè)別手機(jī)定位失敗問(wèn)題)

這篇具有很好參考價(jià)值的文章主要介紹了Android 原生定位開(kāi)發(fā)(解決個(gè)別手機(jī)定位失敗問(wèn)題)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。



前言

在android開(kāi)發(fā)中地圖和定位是很多軟件不可或缺的內(nèi)容,這些特色功能也給人們帶來(lái)了很多方便。定位一般分為三種發(fā)方案:即GPS定位、Google網(wǎng)絡(luò)定位以及基站定位。


本文分別介紹GPS定位、以及基于Google的網(wǎng)絡(luò)Wifi定位的詳細(xì)步驟,(小米手機(jī)獲取位置信息locationManager.getLastKnownLocation(provider)的Location一直為空,查了資料換了種獲取手機(jī)getProviders的方式就可以了)

一、實(shí)現(xiàn)步驟

一般來(lái)說(shuō)我們實(shí)現(xiàn)原生定位的流程大概是:先判斷有無(wú)權(quán)限》有權(quán)限啟動(dòng)一個(gè)LocationSrevice去獲取定位》最后攜帶所需的定位信息返回,進(jìn)行開(kāi)發(fā)。

二、使用步驟

1.服務(wù)啟動(dòng)工具類(lèi)

代碼如下(示例):大概步驟如下,權(quán)限請(qǐng)求可自定義開(kāi)發(fā)關(guān)鍵的是LocationService

/**
 * 獲取定位
 */
public class MyLocationManager implements LocationService.LocationCallBack {
    private Activity context;
    private OnLocationListener onLocationListener;
    private String[] stringsLocation = new String[]{Permission.ACCESS_FINE_LOCATION, Permission.ACCESS_COARSE_LOCATION};

    @Override
    public void Location_Return(double Location_latitude, double Location_longitude, String province, String city, String area, String featureName) {
        onLocationListener.OnLocation(Location_latitude, Location_longitude, province, city, area, featureName);
    }

    public interface OnLocationListener {
        void OnLocation(double Location_latitude, double Location_longitude, String province, String city, String area, String featureName);
    }

    public void setOnLocationListener(OnLocationListener onLocationListener) {
        this.onLocationListener = onLocationListener;
    }

    public MyLocationManager(@NonNull Activity context) {
        this.context = context;
        if (!XXPermissions.isGranted(context, stringsLocation)) {
            MessageDialog codeDialog = new MessageDialog(context, "位置信息權(quán)限使用說(shuō)明", "為確保你能在******內(nèi)使用位置信息******,******需要獲取你的位置信息權(quán)限。允許后,你可以隨時(shí)通過(guò)手機(jī)系統(tǒng)設(shè)置對(duì)授權(quán)進(jìn)行管理。", "取消", "去授權(quán)");
            codeDialog.setCancelable(false);
            codeDialog.show();
            codeDialog.setOnSumbitTextCodeListener(() -> {
                doMainPermission();
                codeDialog.dismiss();
            });
            codeDialog.setOnCancelListener(() -> {
                codeDialog.dismiss();
            });
        } else {
            initData();
        }

    }

    private void doMainPermission() {
        XXPermissions.with(context).permission(stringsLocation).request(new OnPermissionCallback() {
            @Override
            public void onGranted(@NonNull List<String> permissions, boolean allGranted) {
                if (allGranted) {
                    initData();
                }
            }

            @Override
            public void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {
                if (doNotAskAgain) {

                }
            }
        });
    }

    @SuppressLint("MissingPermission")
    private void initData() {
        // 創(chuàng)建 Service 實(shí)例
        LocationService myService = new LocationService();
        // 設(shè)置回調(diào)接口
        myService.setCallback(this);
        // 啟動(dòng) Service 并執(zhí)行操作
        Intent serviceIntent = new Intent(context, LocationService.class);
        context.startService(serviceIntent);
    }
}
/**-------------------------/
不要忘了注冊(cè)
      <service
            android:name=".utils.LocationService"
            android:enabled="true"
            android:exported="false" />

2.實(shí)現(xiàn)LocationService

代碼如下(示例):

/**
 * 獲取定位服務(wù)
 */
public class LocationService extends Service {
    private LocationManager locationManager;
    private MyLocationListener myLocationListener;
    public static LocationCallBack mCallBack = null;

    public interface LocationCallBack {
        void Location_Return(double Location_latitude, double Location_longitude, String province, String city, String area, String featureName);
    }

    public void setCallback(LocationCallBack callback) {
        this.mCallBack = callback;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @SuppressLint("MissingPermission")
    @Override
    public void onCreate() {
        super.onCreate();
        myLocationListener = new MyLocationListener();
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        try {
            GPSLocation();
        } catch (Exception e) {
            if (ObjectUtils.isNotEmpty(locationManager) && ObjectUtils.isNotEmpty(myLocationListener))
                locationManager.removeUpdates(myLocationListener); // 停止所有的定位服務(wù)
            stopSelf();  // 獲取到經(jīng)緯度以后,停止該service
        }
    }

    class MyLocationListener implements LocationListener {
        // 位置改變時(shí)獲取經(jīng)緯度
        @Override
        public void onLocationChanged(Location location) {
            if (ObjectUtils.isNotEmpty(location)) {
                toGeocoder(location);
            }
        }

        // 狀態(tài)改變時(shí)
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }

        // 提供者可以使用時(shí)
        @Override
        public void onProviderEnabled(String provider) {
        }

        // 提供者不可以使用時(shí)
        @Override
        public void onProviderDisabled(String provider) {
        }

    }
/*
**系統(tǒng)內(nèi)容提供器介紹
**一共為四種方式"passive","network","fused","gps"
** "gps":GPS_PROVIDER(GNSS) GNSS HAL 接口和芯片打交道
** "network":NETWORK_PROVIDER 依賴(lài)設(shè)備廠商的具體實(shí)現(xiàn),Android 默認(rèn)實(shí)現(xiàn)依賴(lài) Google 提供的 GMS **  實(shí)現(xiàn)國(guó)內(nèi)無(wú)法使用;一般廠商會(huì)實(shí)現(xiàn)為通過(guò)基站 / WIFI / 藍(lán)牙進(jìn)行融合定位
** "fused":調(diào)用 GMS(谷歌移動(dòng)服務(wù)) 進(jìn)行定位,國(guó)內(nèi)用不了
** "passive":使用 PassiveProvider 在系統(tǒng)位置更新時(shí)通知給應(yīng)用,分享其他 PROVIDER 的定位結(jié)果
*/
    @SuppressLint("MissingPermission")
    private Location getLastKnownLocation(LocationManager locationManager) {
        Location bestLocation = null;
        List<String> providers = locationManager.getProviders(true);
         //由于國(guó)內(nèi)用不了fused 剔除他
        if (providers.contains("fused")) providers.remove("fused");
        //這里我們按照首字母排序,使內(nèi)容提供者調(diào)用順序?yàn)間ps network passive
        Collections.sort(providers);
        LogUtils.e("provider:" + GsonUtils.toJson(providers));
        for (String provider : providers) {
            Location location = locationManager.getLastKnownLocation(provider);
            if (ObjectUtils.isEmpty(location)) {
                LogUtils.e(provider + "定位服務(wù)不可用");
                //執(zhí)行下一個(gè)
                continue;
            } else {
                bestLocation = location;
                LogUtils.e(provider + "定位服務(wù)成功");
                //定位成功返回
                break;
            }
        }
        return bestLocation;
    }
    @SuppressLint("MissingPermission")
    private void GPSLocation() {
        Location location = getLastKnownLocation(locationManager);
        if (location != null) {
            //不為空,顯示地理位置經(jīng)緯度
            String longitude = "Longitude:" + location.getLongitude();
            String latitude = "Latitude:" + location.getLatitude();
            LogUtils.e("Location:" + longitude + latitude);
            toGeocoder(location);
        } else {
            LogUtils.e("Location:" + "Location為空");
            if (ObjectUtils.isNotEmpty(locationManager) && ObjectUtils.isNotEmpty(myLocationListener))
                locationManager.removeUpdates(myLocationListener); // 停止所有的定位服務(wù)
            stopSelf();  // 獲取到經(jīng)緯度以后,停止該service
        }
    }

    @SuppressLint("MissingPermission")
    private void toGeocoder(Location location) {
        String province = "";
        String city = "";
        String area = "";
        String featureName = "";
        try {
            Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
            List<Address> addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
            if (ObjectUtils.isNotEmpty(addresses) && 0 < addresses.size()) {
                Address address = addresses.get(0);
                if (ObjectUtils.isNotEmpty(address)) {
                    // 獲取省份(province)
                    province = address.getAdminArea();
                    // 獲取城市(City)
                    city = address.getLocality();
                    // 獲取區(qū)縣(area)
                    area = address.getSubLocality();
                    //  獲取詳細(xì)地址
                    featureName = address.getFeatureName();
                    // 獲取街道地址
                    String addressLine = address.getAddressLine(0);
                    // 打印詳細(xì)地址信息
                    LogUtils.e("AddressInfo", "province: " + province);
                    LogUtils.e("AddressInfo", "City: " + city);
                    LogUtils.e("AddressInfo", "area: " + area);
                    LogUtils.e("AddressInfo", "FeatureName: " + featureName);
                    LogUtils.e("AddressInfo", "Address Line: " + addressLine);
                }
                mCallBack.Location_Return(location.getLatitude(), location.getLongitude(), province, city, area, featureName);
            }
            if (ObjectUtils.isNotEmpty(locationManager) && ObjectUtils.isNotEmpty(myLocationListener))
                locationManager.removeUpdates(myLocationListener); // 停止所有的定位服務(wù)
            stopSelf();  // 獲取到經(jīng)緯度以后,停止該service
        } catch (Exception e) {
            if (ObjectUtils.isNotEmpty(locationManager) && ObjectUtils.isNotEmpty(myLocationListener))
                locationManager.removeUpdates(myLocationListener); // 停止所有的定位服務(wù)
            stopSelf();  // 獲取到經(jīng)緯度以后,停止該service
            e.printStackTrace();
        }
    }

    @SuppressLint("MissingPermission")
    @Override
    public void onDestroy() {
        super.onDestroy();
        if (ObjectUtils.isNotEmpty(locationManager) && ObjectUtils.isNotEmpty(myLocationListener))
            locationManager.removeUpdates(myLocationListener); // 停止所有的定位服務(wù)
        stopSelf();
    }

}

該處使用原生定位獲取經(jīng)緯度、省市縣等數(shù)據(jù)的詳細(xì)步驟。


總結(jié)

以上就是今天要講的使用Android原生獲取定位內(nèi)容,本文詳細(xì)展現(xiàn)了完整流程,希望對(duì)大家會(huì)有幫助,公司如果有實(shí)力大可不必如此,直接給第三方地圖交錢(qián)就好了,畢竟人家又快又準(zhǔn)(本文僅僅適用于只需經(jīng)緯度或者地址信息的同學(xué),有地圖展現(xiàn)需求的只能想別的方法了哈哈)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-735340.html

到了這里,關(guān)于Android 原生定位開(kāi)發(fā)(解決個(gè)別手機(jī)定位失敗問(wèn)題)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 解決高通 Android 12/13 ota升級(jí)失敗問(wèn)題

    解決高通 Android 12/13 ota升級(jí)失敗問(wèn)題

    1、 Android adb push ota全量包?如下圖所示 2、當(dāng)前設(shè)備是a分區(qū)?如下圖所示 ?3、adb root -adb enable-verity-adb reboot? 如下圖所示 ?4、adb ota包升級(jí)成功 升級(jí)完成之后記得 reboot 重啟一下 如下圖所示 5、當(dāng)前設(shè)備成功切換b分區(qū) 如下圖所示 ?6、到這里基本就結(jié)束了, ota 升級(jí)相關(guān)?Andr

    2024年02月06日
    瀏覽(198)
  • 遠(yuǎn)程桌面連接不上個(gè)別服務(wù)器的問(wèn)題分析與解決方案

    遠(yuǎn)程桌面連接不上個(gè)別服務(wù)器的問(wèn)題分析與解決方案

    在日常的IT運(yùn)維工作中,遠(yuǎn)程桌面連接(RDP,Remote Desktop Protocol)是我們經(jīng)常使用的工具之一,用于管理和維護(hù)遠(yuǎn)程服務(wù)器。然而,有時(shí)我們可能會(huì)遇到無(wú)法連接到個(gè)別服務(wù)器的情況。針對(duì)這一問(wèn)題,我將從多個(gè)角度進(jìn)行分析,并提供相應(yīng)的解決方案。 一、問(wèn)題分析 遠(yuǎn)程桌面

    2024年04月28日
    瀏覽(20)
  • 解決Android Studio的模擬器運(yùn)行失敗的問(wèn)題

    解決Android Studio的模擬器運(yùn)行失敗的問(wèn)題

    ?前面搭建了Android Studio的開(kāi)發(fā)環(huán)境,第一次安裝在默認(rèn)路徑下。新建工程之后想用模擬器運(yùn)行測(cè)試一下,但是模擬器總是運(yùn)行不成功。在網(wǎng)上也按照一些建議,重新安裝HAXM,怎么折騰都不成功。 后來(lái),干脆卸載了Android Studio,重新安裝,并指定路徑到E盤(pán)下,進(jìn)行正常的設(shè)定

    2024年02月14日
    瀏覽(24)
  • 五步解決 Android Studio 模擬器啟動(dòng)失敗問(wèn)題
  • 【問(wèn)題解決】Android Studio 無(wú)法連接手機(jī)(榮耀90)無(wú)法識(shí)別手機(jī)usb

    【問(wèn)題解決】Android Studio 無(wú)法連接手機(jī)(榮耀90)無(wú)法識(shí)別手機(jī)usb

    問(wèn)題描述: 使用AS調(diào)試的時(shí)候遇到一個(gè)問(wèn)題,由于是重裝后的電腦,什么都沒(méi)配置,但是兩個(gè)舊手機(jī)都在安裝SDK tools里的Google usb driver后直接連上AS,而我的新手機(jī)卻死活連不上,查了一下午,啥方法都試了,還是連不上 問(wèn)題解決: 最終發(fā)現(xiàn)在開(kāi)發(fā)人員選項(xiàng)-網(wǎng)絡(luò) 里面有一個(gè)

    2024年02月07日
    瀏覽(37)
  • Android Studio 無(wú)法安裝apk到小米手機(jī)問(wèn)題解決

    以前開(kāi)發(fā)都是用自己的samsung手機(jī),打開(kāi)開(kāi)發(fā)者選項(xiàng)和usb調(diào)試,直接可以連上Android Studio,進(jìn)行調(diào)試,后來(lái)我的samsung退伍了,換上了Apple,就無(wú)法使用了,用公司的小米手機(jī)打開(kāi)開(kāi)發(fā)者選項(xiàng)和usb調(diào)試,然后進(jìn)行調(diào)試,將apk安裝小米手機(jī)安裝應(yīng)用報(bào)錯(cuò)(Failed to establish session?Erro

    2024年02月15日
    瀏覽(36)
  • android 獲取手機(jī)當(dāng)前時(shí)區(qū),解決時(shí)間偏移量和夏令時(shí)差問(wèn)題

    ?//獲取當(dāng)前時(shí)區(qū) ? ? public static int getTimeZone() { ? ? ? ? Date date=new Date(); ? ? ? ? //取得本地時(shí)間 ? ? ? ? Calendar cal = Calendar.getInstance(); ? ? ? ? //取得時(shí)間偏移量 ? ? ? ? int offset = cal.get(Calendar.ZONE_OFFSET)/(1000*60*60); ? ? ? ? //取得夏令時(shí)差 ? ? ? ? int dstOffset=cal.get(Calenda

    2024年02月08日
    瀏覽(17)
  • uniapp,小程序獲取定位,打開(kāi)地圖選擇位置失敗問(wèn)題

    uniapp,小程序獲取定位,打開(kāi)地圖選擇位置失敗問(wèn)題

    場(chǎng)景: 調(diào)用api報(bào)錯(cuò) chooseLocation:fail the api need to be declared in the requiredPrivateInfos field in app.json/ext.json 說(shuō)明: 1.以下 8 個(gè)接口需完成準(zhǔn)入開(kāi)通流程:getFuzzylocation、getLocation、onLocationChange、chooseAddress、choosePoi、chooseLocation、startLocationUpdate、startLocationUpdateBackground 首先需要開(kāi)通權(quán)限

    2024年02月13日
    瀏覽(19)
  • HarmonyOS開(kāi)發(fā):解決DevEco Studio低版本導(dǎo)入高版本項(xiàng)目運(yùn)行失敗問(wèn)題

    HarmonyOS開(kāi)發(fā):解決DevEco Studio低版本導(dǎo)入高版本項(xiàng)目運(yùn)行失敗問(wèn)題

    基于 DevEco?Studio?4.0?Beta2,hvigorVersion為3.0.2 ,開(kāi)發(fā)了一個(gè)項(xiàng)目,上傳到了遠(yuǎn)程倉(cāng)庫(kù),當(dāng)同事下載后,卻始終無(wú)法運(yùn)行,頻繁報(bào)錯(cuò),由于API都是使用的9,第一感覺(jué)就是開(kāi)發(fā)環(huán)境不同,于是,讓其發(fā)來(lái)了他的開(kāi)發(fā)環(huán)境, DevEco?Studio?3.1.1?Release,hvigorVersion為2.4.2 ,果然是環(huán)境不同

    2024年02月05日
    瀏覽(85)
  • 關(guān)于騰訊地圖geolocation.getLocation 經(jīng)常定位失敗,定位時(shí)間過(guò)長(zhǎng)的解決方法

    關(guān)于騰訊地圖geolocation.getLocation 經(jīng)常定位失敗,定位時(shí)間過(guò)長(zhǎng)的解決方法

    今天遇到個(gè)項(xiàng)目,騰訊地圖定位出現(xiàn)問(wèn)題,導(dǎo)致地圖無(wú)法呈現(xiàn)出最近的目標(biāo) ?這是正常的效果,之前一直出現(xiàn)貴州等地點(diǎn)的信息,查看控制臺(tái)的網(wǎng)絡(luò)后,發(fā)現(xiàn)騰訊的定位失敗,要么就是定位時(shí)間過(guò)長(zhǎng),要20S左右,但是換EDGE瀏覽器卻能正常加載, 除了EDGE瀏覽器都會(huì)出現(xiàn)這個(gè)問(wèn)

    2024年02月03日
    瀏覽(48)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包