精华内容
下载资源
问答
  • 高德 开发 Android 定位SDK 开发指南 获取位置 获取定位数据
  • Android应用开发过程中,通常需要获取用户的位置。这就需要


    在Android应用开发过程中,通常需要获取用户的位置。这就需要通过gps或者网络得到用户的地址。

    下面代码实现了:

    • 检测GPS是否开启
    • 打开GPS应用
    • 获取用户位置

    添加权限:

        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <uses-permission android:name="android.permission.INTERNET" />



    代码:

    	
    	/**
    	 * 判断GPS是否开启,GPS或者AGPS开启一个就认为是开启的
    	 * @param context
    	 * @return true 表示开启
    	 */
    	public static final boolean isOPen(final Context context) {
    		LocationManager locationManager 
    		                         = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    		// 通过GPS卫星定位,定位级别可以精确到街(通过24颗卫星定位,在室外和空旷的地方定位准确、速度快)
    		boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    		// 通过WLAN或移动网络(3G/2G)确定的位置(也称作AGPS,辅助GPS定位。主要用于在室内或遮盖物(建筑群或茂密的深林等)密集的地方定位)
    		boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    		
    		if(gps==true)
    		{
    			Log.e(TAG, "Test" + "GPS is open");
    		}
    		
    		if(network==true)
    		{
    			Log.e(TAG, "Test" + "network is open");
    		}
    		
    		if (gps || network) {
    			return true;
    		}
    		return false;
    	}
    	
    	
    	/*
    	 * Toast.makeText( this, “Please turn on GPS”, Toast.LENGTH_SHORT ).show();
    		Intent myIntent = new Intent( Settings.ACTION_SECURITY_SETTINGS );
    		startActivity(myIntent);
    	 */
    	
    	/**
    	 * 强制帮用户打开GPS
    	 * @param context
    	 */
    	public static final void openGPS(Context context) {
    		Intent GPSIntent = new Intent();
    		GPSIntent.setClassName("com.android.settings",
    				"com.android.settings.widget.SettingsAppWidgetProvider");
    		GPSIntent.addCategory("android.intent.category.ALTERNATIVE");
    		GPSIntent.setData(Uri.parse("custom:3"));
    		try {
    			PendingIntent.getBroadcast(context, 0, GPSIntent, 0).send();
    		} catch (CanceledException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	
    	 //Get the Location by GPS or WIFI  
        public static Location getLocation(Context context) {  
            LocationManager locMan = (LocationManager) context  
                    .getSystemService(Context.LOCATION_SERVICE);  
            Location location = locMan  
                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);  
            if (location == null) {  
                location = locMan  
                        .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);  
            }  
            return location;  
        }  
    
        //get address from location
         public static  Address getAddressbyLocation(Context context, Location location) {  
             Address result = null;  
             try {  
                 if (location != null) {  
                     Geocoder gc = new Geocoder(context, Locale.CHINA);  
                      
                     double geoLatitude = location.getLatitude();  
                     double geoLongitude = location.getLongitude();  
                       
                     List<Address> lstAddress = gc.getFromLocation(geoLatitude,  
                             geoLongitude, 1);  
                     if (lstAddress.size() > 0) {  
                         result = lstAddress.get(0);  
                     }  
                 }  
             } catch (Exception e) {  
                 e.printStackTrace();  
             }  
             return result;  
         }  

    测试代码:

    	public static  void test(Context context) {
    
    			Log.e(TAG, "Test" + isOPen(context));
    			Log.e(TAG, "Test" + getAddressbyLocation(context, getLocation(context)).getAddressLine(0));
    			Log.e(TAG, "Test" + getAddressbyLocation(context, getLocation(context)).getLocality());
    			
    	}





    展开全文
  • 安卓开发-Gps定位获取位置信息

    千次阅读 2017-09-13 19:48:00
    // 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息 // 参数4,监听 // 备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新 // ...

    《版本一》
    1.显示控件 和 LocationManager 设为成员变量,在MainActivity中初始化

    private EditText editText;  
    private LocationManager lm;
    
    editText = (EditText) findViewById(R.id.editText);  
    lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  

    2.检查GPS是否开启,否则开启

    if (!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {  
        Toast.makeText(this, "请开启GPS导航...", Toast.LENGTH_SHORT).show();  
        // 返回开启GPS导航设置界面  
        Intent intent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);  
        startActivityForResult(intent, 0);  
    
        return;  
    }

    3.得到provider(lm + criteria): 通过配置criteria的参数,通过 LocationManager.getBestProvider(getCriteria(), true);得到String的provider。

    String bestProvider = lm.getBestProvider(getCriteria(), true);  
    
    private Criteria getCriteria() {  
            Criteria criteria = new Criteria();  
            // 设置定位精确度 Criteria._COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细  
            criteria.setAccuracy(Criteria.ACCURACY_FINE);  
            // 设置是否要求速度  
            criteria.setSpeedRequired(false);  
            // 设置是否允许运营商收费  
            criteria.setCostAllowed(false);  
            // 设置是否需要方位信息  
            criteria.setBearingRequired(false);  
            // 设置是否需要海拔信息  
            criteria.setAltitudeRequired(false);  
            // 设置对电源的需求  
            criteria.setPowerRequirement(Criteria.POWER_LOW);  
            return criteria;  
        }  

    4.得到location(lm + provider)

    Location location = lm.getLastKnownLocation(bestProvider);  

    5.傳入location更新控件View updateView(location)

        updateView(location); 
    
        private void updateView(Location location) {  
            if (location != null) {  
                editText.setText("设备位置信息\n\n经度:");  
                editText.append(String.valueOf(location.getLongitude()));  
                editText.append("\n纬度:");  
                editText.append(String.valueOf(location.getLatitude()));  
            } else {  
                // 清空EditText对象  
                editText.getEditableText().clear();  
            }  
        }  

    6.lm中設置位置變化監聽器:

    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locationListener);

    // 参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种
    // 参数2,位置信息更新周期,单位毫秒
    // 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息
    // 参数4,监听
    // 备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新

    // 1秒更新一次,或最小位移变化超过1米更新一次;
    // 注意:此处更新准确度非常低,推荐在service里面启动一个Thread,在run中sleep(10000);然后执行handler.sendMessage(),更新位置

    public void onLocationChanged(Location location) {  
              updateView(location);  
          }  
    
           // GPS状态变化时触发 
          public void onStatusChanged(String provider, int status, Bundle extras)
           {  
              switch (status) {  
              // GPS状态为可见时  
              case LocationProvider.AVAILABLE:  
                  Log.i(TAG, "当前GPS状态为可见状态");  
                  break;  
              // GPS状态为服务区外时  
              case LocationProvider.OUT_OF_SERVICE:  
                  Log.i(TAG, "当前GPS状态为服务区外状态");  
                  break;  
              // GPS状态为暂停服务时  
              case LocationProvider.TEMPORARILY_UNAVAILABLE:  
                  Log.i(TAG, "当前GPS状态为暂停服务状态");  
                  break;  
              }  
          }  
    
           // GPS开启时触发 
          public void onProviderEnabled(String provider) {  
              Location location = lm.getLastKnownLocation(provider);  
              updateView(location);  
          }  
    
           // GPS禁用时触发 
          public void onProviderDisabled(String provider) {  
              updateView(null);  
          }  
    
      };  

    7.lm中設置GPS狀態監聽器 lm.addGpsStatusListener(listener);

    GpsStatus.Listener listener = new GpsStatus.Listener() {  
          public void onGpsStatusChanged(int event) {  
              switch (event) {  
              // 第一次定位  
              case GpsStatus.GPS_EVENT_FIRST_FIX:  
                  Log.i(TAG, "第一次定位");  
                  break;  
              // 卫星状态改变  
              case GpsStatus.GPS_EVENT_SATELLITE_STATUS:  
                  Log.i(TAG, "卫星状态改变");  
                  // 获取当前状态  
                  GpsStatus gpsStatus = lm.getGpsStatus(null);  
                  // 获取卫星颗数的默认最大值  
                  int maxSatellites = gpsStatus.getMaxSatellites();  
                  // 创建一个迭代器保存所有卫星  
                  Iterator<GpsSatellite> iters = gpsStatus.getSatellites()  
                          .iterator();  
                  int count = 0;  
                  while (iters.hasNext() && count <= maxSatellites) {  
                      count++;  
                  }  
                 Log.v("520", "卫星数:" + count);
                  break;  
              // 定位启动  
              case GpsStatus.GPS_EVENT_STARTED:  
                  Log.i(TAG, "定位启动");  
                  break;  
              // 定位结束  
              case GpsStatus.GPS_EVENT_STOPPED:  
                  Log.i(TAG, "定位结束");  
                  break;  
              }  
          };  
      };  

    8.在主配置文件中添加如下权限:

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

    结束
    1.相关类:
    android.location:
    (1) LocationManager
    提供访问定位服务的功能,也提供了获取最佳定位提供者的功能
    (2)Criteria
    传入LocationManager中的getBestProvider来得到最佳的定位提供者
    (3)LocationProvider(抽象类)
    定位提供者的抽象类,具备周期性报告设备地理位置的功能
    (4)LocationListener
    经度纬度发生变化时会回调此方法
    2.通过Gps定位获得位置相关的信息(经度,纬度的等),为LocationManager设置位置变化监听器和卫星状态变化监听器。

    《版本二》

        //开始GPS定位
        private void startGps() {
            //1.获取到LocationManager对象
            gpsManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    
            //2.得到定位服务者provider:provider可为gps定位,也可为为基站和WIFI定位
            String provider = gpsManager.getProvider(LocationManager.GPS_PROVIDER).getName();
    
            //3.设置位置监听器:3000ms为定位的间隔时间,10m为距离变化阀值,gpsListener为回调接口
            gpsManager.requestLocationUpdates(provider, 3000, 10, gpsListener);
        }
    
        //停止GPS定位
        private void stopGps() {
            gpsManager.removeUpdates(gpsListener);
        }
    
        // 创建位置监听器
        private LocationListener gpsListener = new LocationListener() {
    
            @Override
            public void onLocationChanged(Location location) {
                Log.e("Location", "onLocationChanged");
                double latitude = location.getLatitude();
                double longitude = location.getLongitude();
                float speed = location.getSpeed();
                long time = location.getTime();
                String s = "latitude--->" + latitude
                        +  "  longitude--->" + longitude
                        +  "  speed--->" + speed 
                        +  "  time--->" + new Date(time).toLocaleString();
                mTextView.setText("GPS定位\n" + s);
            }
    
    展开全文
  • 今天小编就为大家分享一篇Android6.0获取GPS定位获取位置权限和位置信息的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Android 百度定位sdkv61.3获取位置信息

    万次阅读 2015-11-19 10:36:27
    最近在弄混合定位,使用Android自带的network定位经常会定位不到,也就是location经常为空,而gps只能在室外定位,室内收不到星。使用很不方便。那就用了一下百度定位sdk,感觉很不错。 百度定位分为三种定位模式: ...

    最近在弄混合定位,使用Android自带的network定位经常会定位不到,也就是location经常为空,而gps只能在室外定位,室内收不到星。使用很不方便。那就用了一下百度定位sdk,感觉很不错。

    百度定位分为三种定位模式

    高精度定位模式  LocationMode.Hight_Accuracy:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果;

    低功耗定位模式 LocationMode.Battery_Saving:这种定位模式下,不会使用GPS,只会使用网络定位(Wi-Fi和基站定位);

    仅用设备定位模式 LocationMode.Device_Sensors:这种定位模式下,不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位。

    一、申请key

    使用百度定位、导航、地图等sdk需要申请key才可以使用。申请地址http://lbsyun.baidu.com/apiconsole/key申请key首先需要有一个百度账号。

    详细过程 http://write.blog.csdn.net/postedit/49925805

    二、导入jar包和so文件

    在相关下载 点击全部下载,选择需要的定位功能,如果需要实现其他功能也可以一块下载其他的开发包。

    将下载的locsdkDevelop6.1.3解压得到两个压缩文件liblocSDK6a.rar和locSDK_6.13.jar,将locSDK_6.13.jar文件导入到Eclipse开发的工程libs目录下。将liblocSDK6a.rar文件解压得到的arm64-v8a,armeabi等文件夹复制到libs目录下。

    点击 工程属性->Java Build Path->Libraries中选择“Add External JARs”,选定locSDK_6.13,确定后返回。

    三、工程代码

    布局文件location.cml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
        <Button
            android:id="@+id/bt_location"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="@string/start_location"/>
        <TextView
            android:id="@+id/loc_info"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="18sp" />
    </LinearLayout>
    配置清单文件AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="cn.vn.lbs"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="19" />
    	<!-- 这个权限用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <!-- 这个权限用于访问GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    <!-- 用于读取手机当前的状态-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <!-- 访问网络,网络定位需要上网-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- SD卡读取权限,用户写入离线定位数据-->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <meta-data
                android:name="com.baidu.lbsapi.API_KEY"
                android:value="  " />  //这里填写自己申请的key
            <service android:name="com.baidu.location.f" 
                android:enabled="true" 
                android:process=":remote">
    	</service>	
            <activity
                android:name="cn.vn.lbs.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    工程代码:

    package cn.vn.lbs;
    import com.baidu.location.BDLocation;
    import com.baidu.location.BDLocationListener;
    import com.baidu.location.LocationClient;
    import com.baidu.location.LocationClientOption;
    import com.baidu.location.Poi;
    import com.baidu.location.LocationClientOption.LocationMode;
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    	public LocationClient mLocationClient = null;
    	private Button bt_location;
    	private TextView loc_info;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.location);
    		bt_location=(Button) findViewById(R.id.bt_location);
    		loc_info=(TextView) findViewById(R.id.loc_info);
    		bt_location.setOnClickListener(new OnClickListener(){
    			@Override
    			public void onClick(View arg0) {
    				if (bt_location.getText().toString().equals(getString(R.string.start_location))) {
    					mLocationClient.start();// 定位SDK
    								// start之后会默认发起一次定位请求,开发者无须判断isstart并主动调用request
    					bt_location.setText(getString(R.string.stop_location));
    				} else {
    					mLocationClient.stop();
    					bt_location.setText(getString(R.string.start_location));
    				}
    			}
    			
    		});
    	}
    	@Override
    	protected void onDestroy() {
    		super.onDestroy();
    		mLocationClient.unRegisterLocationListener(MyLocationListener);
    	}
    	@Override
    	protected void onStart() {
    		super.onStart();
    		mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类
    	    mLocationClient.registerLocationListener(MyLocationListener);    //注册监听函数
    	    initLocation();
    	}
    	@Override
    	protected void onStop() {
    		super.onStop();
    	}
    	private void initLocation(){
            LocationClientOption option = new LocationClientOption();
            option.setLocationMode(LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
            option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
            int span=1000;
            option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
            option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
            option.setOpenGps(true);//可选,默认false,设置是否使用gps
            option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
            option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
            option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
            option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死
            option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
            option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
            mLocationClient.setLocOption(option);
        }
    	public BDLocationListener MyLocationListener = new BDLocationListener() {
    		@Override
    		public void onReceiveLocation(BDLocation location) {
    			if (null != location && location.getLocType() != BDLocation.TypeServerError) {
    				StringBuffer sb = new StringBuffer(256);
    				sb.append("time : ");
    				/**
    				 * 时间也可以使用systemClock.elapsedRealtime()方法 获取的是自从开机以来,每次回调的时间;
    				 * location.getTime() 是指服务端出本次结果的时间,如果位置不发生变化,则时间不变
    				 */
    				sb.append(location.getTime());
    				sb.append("\nerror code : ");
    				sb.append(location.getLocType());
    				sb.append("\nlatitude : ");
    				sb.append(location.getLatitude());
    				sb.append("\nlontitude : ");
    				sb.append(location.getLongitude());
    				sb.append("\nradius : ");
    				sb.append(location.getRadius());
    				sb.append("\nCountryCode : ");
    				sb.append(location.getCountryCode());
    				sb.append("\nCountry : ");
    				sb.append(location.getCountry());
    				sb.append("\ncitycode : ");
    				sb.append(location.getCityCode());
    				sb.append("\ncity : ");
    				sb.append(location.getCity());
    				sb.append("\nDistrict : ");
    				sb.append(location.getDistrict());
    				sb.append("\nStreet : ");
    				sb.append(location.getStreet());
    				sb.append("\naddr : ");
    				sb.append(location.getAddrStr());
    				sb.append("\nDescribe: ");
    				sb.append(location.getLocationDescribe());
    				sb.append("\nDirection(not all devices have value): ");
    				sb.append(location.getDirection());
    				sb.append("\nPoi: ");
    				if (location.getPoiList() != null && !location.getPoiList().isEmpty()) {
    					for (int i = 0; i < location.getPoiList().size(); i++) {
    						Poi poi = (Poi) location.getPoiList().get(i);
    						sb.append(poi.getName() + ";");
    					}
    				}
    				if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果
    					sb.append("\nspeed : ");
    					sb.append(location.getSpeed());// 单位:km/h
    					sb.append("\nsatellite : ");
    					sb.append(location.getSatelliteNumber());
    					sb.append("\nheight : ");
    					sb.append(location.getAltitude());// 单位:米
    					sb.append("\ndescribe : ");
    					sb.append("gps定位成功");
    				} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果
    					// 运营商信息
    					sb.append("\noperationers : ");
    					sb.append(location.getOperators());
    					sb.append("\ndescribe : ");
    					sb.append("网络定位成功");
    				} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
    					sb.append("\ndescribe : ");
    					sb.append("离线定位成功,离线定位结果也是有效的");
    				} else if (location.getLocType() == BDLocation.TypeServerError) {
    					sb.append("\ndescribe : ");
    					sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
    				} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
    					sb.append("\ndescribe : ");
    					sb.append("网络不同导致定位失败,请检查网络是否通畅");
    				} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
    					sb.append("\ndescribe : ");
    					sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
    				}
    				Log.i("BaiduLocationApiDem", sb.toString());
    				loc_info.setText(sb.toString());
    			}
    		}
    	};
    }

    mLocationClient.start()

    start:启动定位SDK。 stop:关闭定位SDK。调用start之后只需要等待定位结果自动回调即可。

    开发者定位场景如果是单次定位的场景,在收到定位结果之后直接调用stop函数即可。

    如果stop之后仍然想进行定位,可以再次start等待定位结果回调即可。

    如果开发者想按照自己逻辑请求定位,可以在start之后按照自己的逻辑请求locationclient.requestLocation()函数,会主动触发定位SDK内部定位逻辑,等待定位回调即可。


    百度定位还可实现位置提醒功能:

    位置提醒最多提醒3次,3次过后将不再提醒。 假如需要再次提醒,或者要修改提醒点坐标,都可通过函数SetNotifyLocation()来实现。

    //位置提醒相关代码
    mNotifyer = new NotifyLister();
    mNotifyer.SetNotifyLocation(42.03249652949337,113.3129895882556,3000,"gps");//4个参数代表要位置提醒的点的坐标,具体含义依次为:纬度,经度,距离范围,坐标系类型(gcj02,gps,bd09,bd09ll)
    mLocationClient.registerNotify(mNotifyer);
    //注册位置提醒监听事件后,可以通过SetNotifyLocation 来修改位置提醒设置,修改后立刻生效。
    //BDNotifyListner实现
    public class NotifyLister extends BDNotifyListener{
           public void onNotify(BDLocation mlocation, float distance){
     	   mVibrator01.vibrate(1000);//振动提醒已到设定位置附近
           }
        }
    //取消位置提醒
    mLocationClient.removeNotifyEvent(mNotifyer);
    这个没有测试,不过应该是没有问题的。

    展开全文
  • } /**--用循环获取定位方法-- * 为获取地理位置信息时设置查询条件, * 是按GPS定位还是NETWORK定位 */ Location location = getLastKnownLocation(); /** 获取定位信息 **/ upDataLocation(location); /**--监听...

    1、新建类MyLocation.java,并继承Activity。

    注意:程序中  Vector2D类需要引入 

    implementation 'com.vividsolutions:jts-core:1.14.0'

    2、构造函数(可以根据自身需求增删):

    public MyLocation(Context _context, MapView _mapView, GraphicsOverlay _locationGOlay){
        this.context = _context;
        this.mMapView = _mapView;
        locationGOlay = _locationGOlay;
    }

    3、使用如下:

    MyLocation myLocation = new MyLocation(MainActivity.this, mMapView, mGraphicsOverlay);
    // 调用定位初始化
    myLocation.initLocaltionMethod();

    4、代码如下:

       public static double pi = 3.1415926535897932384626;
        public static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
        public static double a = 6378245.0;
        public static double ee = 0.00669342162296594323;
    
        private static final int GPS_REQUEST_CODE = 200;
    
        private Context context;
        private MapView mMapView;
        private LocationManager mLocationManager;
        private GraphicsOverlay locationGOlay;
        private String mLongitude = ""; // 经度
        private String mLatitude = ""; // 维度
    
    
        /**
         * 构造方法
         */
        public MyLocation(Context _context,MapView _mapView,GraphicsOverlay _locationGOlay) {
            this.context = _context;
            this.mMapView = _mapView;
            locationGOlay = _locationGOlay;
        }
    
    
        /**
         * 初始化定位方法
         */
        public void initLocaltionMethod() {
            //获取定位服务
            mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    
            //检查NETWORK定位是否被打开
            boolean networkIsOpen = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
            //检查passive定位是否被打开
            boolean passiveIsOpen = mLocationManager.isProviderEnabled(LocationManager.PASSIVE_PROVIDER);
            //检查GPS定位是否被打开
            boolean gpsIsOpen = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            if (networkIsOpen || passiveIsOpen || gpsIsOpen) {
                //定位
                startLocation();
            } else {
                Toast.makeText(context,"请打开地理位置",Toast.LENGTH_SHORT).show();
            }
        }
    
    
       /**
         * 执行定位-判断定位权限
         */
        private void startLocation() {
            // 判断定位权限
            if (ActivityCompat.checkSelfPermission(context,Manifest.permission.ACCESS_FINE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED
                    && ActivityCompat.checkSelfPermission(context,Manifest.permission.ACCESS_COARSE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) {
                // 调用动态申请权限
                requestPermission();
    
                return;
            }
            /**--用循环获取定位方法--
             *  为获取地理位置信息时设置查询条件,
             *  是按GPS定位还是NETWORK定位
             */
            Location location = getLastKnownLocation();
            /** 获取定位信息 **/
            upDataLocation(location);
    
            /**--监听位置变化--
             * 5 秒更新一次或最小位移变化超过10米更新一次
             *
             * LocationManager.GPS_PROVIDER 可以替换成 location.getProvider()
             * 替换后更新的坐标就不一定是gps定位信息,而是GPS、NETWORK 、PASSIVE其中之一
             * */
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,5000,10, gpsListener);
    
        }
    
    
            /**
             * 监听器
             * */
            LocationListener gpsListener = new LocationListener() {
                //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
                @Override
                public void onLocationChanged(Location location) {
                    /** 获取gps定位信息-修正定位 **/
                    upDataLocation(location);
                    /** 清除定位监听器 **/
                    removeListener();
                }
                // Provider 在可用、暂时不可用和无服务三个状态直接切换时触发此函数
                @Override
                public void onStatusChanged(String provider,int status,Bundle extras) {
    
                }
                //  Provider被enable时触发此函数,比如GPS被打开
                @Override
                public void onProviderEnabled(String provider) {
    
                }
                // Provider被disable时触发此函数,比如GPS被关闭
                @Override
                public void onProviderDisabled(String provider) {
    
                }
        };
    
    
        /**
         * 清除监听器
         * */
        public void removeListener() {
            if (mLocationManager != null) {
                // 清除gps监听器
                mLocationManager.removeUpdates(gpsListener);
            }
        }
    
    
    
    
        /**
         *  动态申请权限
         */
        private void requestPermission() {
            /**
             * //22
             * Build.VERSION_CODES.LOLLIPOP_MR1
             *
             * //23
             * Build.VERSION_CODES.M
             *
             * //26
             * Build.VERSION_CODES.O
             * */
            // 判断SDK是否大于23
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    
                AlertDialog.Builder alter = new AlertDialog.Builder(context);
                alter.setTitle("GPS定位权限");
                alter.setMessage("是否打开定位权限?");
                // 取消
                alter.setNegativeButton("取消",new DialogInterface.OnClickListener(){
    
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        // 关闭dialog
                        dialogInterface.dismiss();
                    }
                });
    
                alter.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ActivityCompat.requestPermissions((Activity) context,
                                new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                                GPS_REQUEST_CODE);
                    }
                });
                alter.show();
    
            } else {
                Toast.makeText(context, "当前SDK版本小于23", Toast.LENGTH_SHORT).show();
            }
        }
    
        /**
         * 执行定位、更新定位
         */
        private void upDataLocation(Location location) {
    
            if (location != null) {
                /**
                 * 定位方式:location.getProvider(); - (返回类型:String)
                 * 经度:location.getLongitude(); - (返回类型:double)
                 * 纬度:location.getLatitude(); - (返回类型:double)
                 * 海拔:location.getAltitude(); - (返回类型:double)
                 * 时间:location.getTime(); - (返回类型:long)
                 * 速度:location.getSpeed() - (返回类型:float)
                 * 方向:location.getBearing() - (返回类型:float)
                 * */
                mLongitude = String.valueOf(location.getLongitude());// 经度
                mLatitude = String.valueOf(location.getLatitude());// 纬度
              
                /* if (location.getProvider().equals("network")){
                    Toast.makeText(context, "NETWORK定位经度:"+mLongitude+"|"+"维        度:"+mLatitude, Toast.LENGTH_SHORT).show();
                }else if (location.getProvider().equals("gps")){
                    Toast.makeText(context, "GPS定位经度:"+mLongitude+"|"+"维度:"+mLatitude, Toast.LENGTH_SHORT).show();
                }else if (location.getProvider().equals("passive")){
                    Toast.makeText(context, "PASSIVE定位经度:"+mLongitude+"|"+"维度:"+mLatitude, Toast.LENGTH_SHORT).show();
                }*/
    
                double lat = location.getLatitude();
                double lon = location.getLongitude();
    
                double[] vv = gps84_To_Gcj02(lat,lon);
                Vector2D lonLat = new Vector2D(vv[1],vv[0]);
                Vector2D vector2D = lonLatToMercator(lonLat);
                Point location_point = new Point(vector2D.getX(),vector2D.getY());
                Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),R.mipmap.location);
                BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap);
                PictureMarkerSymbol pictureMarkerSymbol = new PictureMarkerSymbol(bitmapDrawable);
                // 创建添加绘制对象图层
                Graphic graphic = new Graphic(location_point,pictureMarkerSymbol);
    
                //mMapView.getGraphicsOverlays().add(locationGOlay);
                // 清除绘制的信息
                locationGOlay.getGraphics().clear();
    
                locationGOlay.getGraphics().add(graphic);
    
                mMapView.setViewpointGeometryAsync(location_point);
                mMapView.setViewpointScaleAsync(2000);
            } else {
                Toast.makeText(context,"获取不到经纬度,请稍后再试",Toast.LENGTH_SHORT).show();
            }
        }
        
        /**
         *循环获取GPS、NETWORK、PASSIVE定位方式
         * */
        private Location getLastKnownLocation() {
            mLocationManager = (LocationManager)context.getSystemService(LOCATION_SERVICE);
            List<String> providers = mLocationManager.getProviders(true);
            Location bestLocation = null;
            for (String provider : providers) {
                @SuppressLint("MissingPermission")
                Location location = mLocationManager.getLastKnownLocation(provider);
                if (location == null) {
                    continue;
                }
                if (bestLocation == null || location.getAccuracy() < bestLocation.getAccuracy()) {
                    bestLocation = location;
                }
            }
            return bestLocation;
        }
    
    
    
        /**转换坐标*/
        public static double transformLat(double x, double y) {
            double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y
                    + 0.2 * Math.sqrt(Math.abs(x));
            ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
            ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
            ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
            return ret;
        }
    
        public static double transformLon(double x, double y) {
            double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1
                    * Math.sqrt(Math.abs(x));
            ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
            ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
            ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0
                    * pi)) * 2.0 / 3.0;
            return ret;
        }
    
        /**
         * 84 to 火星坐标系 (GCJ-02) World Geodetic System ==> Mars Geodetic System
         *
         * @param lat
         * @param lon
         * @return
         */
        public static double[] gps84_To_Gcj02(double lat, double lon) {
    
            double dLat = transformLat(lon - 105.0, lat - 35.0);
            double dLon = transformLon(lon - 105.0, lat - 35.0);
            double radLat = lat / 180.0 * pi;
            double magic = Math.sin(radLat);
            magic = 1 - ee * magic * magic;
            double sqrtMagic = Math.sqrt(magic);
            dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
            dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
            double mgLat = lat + dLat;
            double mgLon = lon + dLon;
            return new double[]{mgLat, mgLon};
        }
    
          /**经纬度转墨卡托投影*/
          public Vector2D lonLatToMercator(Vector2D lonLat){
                 double x = lonLat.getX() * 20037508.34 / 180;
                 double y = Math.log(Math.tan((90 + lonLat.getY()) * Math.PI / 360)) / (Math.PI / 180);
                 y = y * 20037508.34 / 180;
    
                 Vector2D mercator = new Vector2D(x,y);
    
                 return mercator;
         }
         /**墨卡托投影转经纬度*/
         public Vector2D MercatorTolonLat(Vector2D mercator){
             double x = mercator.getX() / 20037508.34 * 180;
             double y = mercator.getY() / 20037508.34 * 180;
             y = 180 / Math.PI * (2 * Math.atan(Math.exp(y * Math.PI / 180)) - Math.PI / 2);
    
             Vector2D lonLat =  new Vector2D(x,y);
            return lonLat;
         }
    
        /**
         *  实现 onActivityResult
         *  本类必须继承
         *  AppCompatActivity或者Activity
         * */
        @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode ==GPS_REQUEST_CODE){
                startLocation();// 执行定位
            }
        }
    

     

    展开全文
  • 1.添加权限--6.0之后要动态获取,下面会说&lt;uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION"/&gt;2.直接上代码,不多说,代码中注释很详细。private static final ...
  • 本文实例为大家分享了Android获取位置信息的具体代码,供大家参考,具体内容如下 1.位置服务的简介:位置服务,英文翻译为Location-Based Services,缩写为LBS,又称为定位服务或基于位置的服务,融合了GPS定位、移动...
  • Android开发之Android定位与百度位置应用开发一、功能说明二、设计分析三、运行界面展示四、源码仓库地址链接 一、功能说明 调用百度地图显示画面,并获取定位信息 二、设计分析 1.注册和获取密钥 开发者在使用SDK...
  • Android百度定位获取经纬度

    千次阅读 2017-09-25 17:36:55
    Android百度定位获取经纬度,获取经纬度
  • 定位功能在app开发中很常用,大多数企业都是不具备定位资质的,所有一般是通过接入第三方的sdk来进行定位,比较熟悉的有如:百度、高德、谷歌、腾讯等。而国内比较地图策划比较成熟的主要是百度和高德,这里就以百度...
  • 1.添加权限--6.0之后要动态获取,下面会说2.直接上代码,不多说,代码中注释很详细。private static final int BAIDU_READ_PHONE_STATE = 100;//定位权限请求private static final int PRIVATE_CODE = 1315;//开启...
  • 欢迎使用Markdown编辑器写博客求大神绕过,这个仅限于初级开发者初始化定位 private void initLocation() { //定位客户端的设置 mLocationClient = new LocationClient(getActivity()); mLocationListener =...
  • Android平台开发定位相关的应用程序,需要位置提供者。有两种类型的位置提供者:GPS定位网络定位以上两种类型,任何一种都可以获得用户或者用户设备的位置信息。但是,它们各有优劣,推荐两者同时使用。GPS 定位,...
  • 我使用的是AS2.2.2,首先FQ注册google开发者帐号,准备获取API Key,网上有许多相关资料我就不再赘述,这里讲一个比较小白级的获取方法,可以减少许多输入 1.1. AS创建项目添加一个Google Map Activity 1.2 创建...
  • Android开发项目时常常会遇到定位这个功能,所以写了这篇博客,今天主要讲的高德地图的定位获取相应信息。首先导入高德的jar包image选中jar包右键点击 Add As Library, 在build.fradle中看到如下代码 表示导包...
  • 安卓6.0 ,第一行代码11章节,获取位置信息不显示安卓6.0 ,获取位置信息,不显示MainActivity.javapublic class MainActivity extends AppCompatActivity {private TextView positionTextView;private ...
  • android定位获取当前位置的经纬度

    万次阅读 2015-11-16 15:21:55
    有了 Android 系统作为载体,我们可以利用定位出的位置进行许多丰富多彩的操作,比如定位城市,根据我们当前的位置,查找要去的目的地的路线等等,因此,现在几乎开发的每一款互联网app产品都有定位功能,好了,现在...
  • Android GPS应用:动态获取位置信息

    万次阅读 2013-07-20 14:18:42
    随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号...在本文中,开发一个小应用,实时获取定位信息,包括用户所在的纬度、经度、高度、方向、移动速度等。代码如下: Activity: pa...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,769
精华内容 11,907
关键字:

安卓开发定位获取位置信息