android原生システムサービス位置決め実現

16183 ワード

通常、地図の地位、すなわちリアルタイムの経度と緯度の完成した位置決めを取得することはありません.Androidのオープンソース特性のため、androidシステムは多種多様で、この位置づけは、学生時代はまだ遊んでいたが、プロジェクトの中では、すべての機種に適用できなかった.だから遊ぶのはやはりできて、プロジェクトの中でやはり第三者を使って、第三者が互換性をしたためです.
Androidには、次の3つのロケーションプロバイダがあります.
  • GPS_PROVIDER:GPS測位を使用し、精度は比較的高いが、非常に消費電力がある.
  • NETWORK_PROVIDER:ネットワークを使用して位置決めし、精度はやや悪いが、消費電力は比較的小さい.
  • PASSIVE_PROVIDER:少ない使用(しばらく考慮せず)
  • コード実装:システム・サービス宣言:
    
        LocationManager locationManager; //    
        private String mLongitude = ""; //   
        private String mLatitude = ""; //   
    
    

    GPSが開いているかどうかを判断し、開いていなければ手動で開く:
     private void initLocalLibView() {
           //      
            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            //         
            boolean gpsIsOpen = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            if (gpsIsOpen) {
                //        
                rl_choose_nolocation.setVisibility(View.GONE);
                lv_choose_location.setVisibility(View.VISIBLE);
                //  
                startLocation();
            } else {
                rl_choose_nolocation.setVisibility(View.VISIBLE);
                lv_choose_location.setVisibility(View.GONE);
                Toast.makeText(this, "       ,            ", Toast.LENGTH_SHORT).show();
    //            T.showShort("       ,            ");// TODO: 2017/8/15
            }
        }
    

    ロケーションの取得:
    
    private void startLocation() {
    
            //                    GPS    network  
            String bestProvider = getProvider();
    
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                requestPermission();
                return;
            }
            Location location = locationManager.getLastKnownLocation(bestProvider);
            mLongitude = String.valueOf(location.getLongitude());
            mLatitude = String.valueOf(location.getLatitude());
    
            Log.e("tude","Location" + "  :" + mLatitude + "
    " + " : " + mLongitude); } /** * * , , */ private String getProvider() { // Criteria criteria = new Criteria(); // Criteria.ACCURACY_COARSE ,Criteria.ACCURACY_FINE //Criteria.ACCURACY_FINE, , , , Criteria.ACCURACY_COARSE, // : criteria.setAccuracy(Criteria.ACCURACY_FINE); // criteria.setSpeedRequired(false); // : criteria.setAltitudeRequired(false); // : criteria.setBearingRequired(false); // : criteria.setCostAllowed(false); // : criteria.setPowerRequirement(Criteria.POWER_LOW); // provider, 2 true , provider , provider return locationManager.getBestProvider(criteria, true); } /** * 6.0 */ private void requestPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_CODE_STORAGE); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (PERMISSION_REQUEST_CODE_STORAGE == requestCode) { if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { // requestPermission(); Toast.makeText(_activity," , ",Toast.LENGTH_SHORT).show(); } else { startLocation(); } return; } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }

    gpsが設定されていない場合は、設定ページにジャンプして設定できます.
       //         ,    GPS
       Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
       startActivityForResult(intent, START_ACTION_LOCATION_SOURCE_SETTINGS); //              
    

    上の位置決め機能はすでに実現できます.
    リアルタイムの位置付けに関するリスニングを取得するには、次のようにします.
    import java.text.SimpleDateFormat;  
    import java.util.Date;  
    import java.util.Iterator;  
      
    import android.app.Activity;  
    import android.content.Context;  
    import android.content.Intent;  
    import android.location.Criteria;  
    import android.location.GpsSatellite;  
    import android.location.GpsStatus;  
    import android.location.Location;  
    import android.location.LocationListener;  
    import android.location.LocationManager;  
    import android.location.LocationProvider;  
    import android.os.Bundle;  
    import android.provider.Settings;  
    import android.util.Log;  
    import android.view.View;  
    import android.view.View.OnClickListener;  
    import android.widget.Button;  
    import android.widget.TextView;  
    import android.widget.Toast;  
      
    import com.lidroid.xutils.HttpUtils;  
    import com.lidroid.xutils.exception.HttpException;  
    import com.lidroid.xutils.http.ResponseInfo;  
    import com.lidroid.xutils.http.callback.RequestCallBack;  
    import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;  
      
    public class MainActivity extends Activity {  
        private TextView logText;  
        private TextView currentTime;  
        private TextView urlInfoId;  
        private TextView resultInfoId;  
        private TextView editUrl;  
        private TextView editTime;  
        private Button commitBtn;  
      
        private LocationManager lm;  
        private static final String TAG = "MainActivity";  
        private long minTime = 1000 * 5;  
        private float minDistance = 0;  
      
        private static int period = 1000 * 5; // 5s  
        private String url = "";//      url  
        private long lastMillis = 0;//           
      
        private String longitude = ""; //     
        private String latitude = ""; //     
      
        SimpleDateFormat format = new SimpleDateFormat("yyyy mm dd  HH:mm:ss");  
      
        @Override  
        protected void onDestroy() {  
            super.onDestroy();  
            lm.removeUpdates(locationListener);  
        }  
      
        private void setLog(String txt) {  
            setLogInfo(txt);  
        }  
      
        private void setLogInfo(String txt) {  
      
            logText.setText("
    :" + format.format(new Date()) + "
    " + txt); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gps_demo); currentTime = (TextView) this.findViewById(R.id.currentTime); urlInfoId = (TextView) this.findViewById(R.id.urlInfoId); resultInfoId = (TextView) this.findViewById(R.id.resultInfoId); logText = (TextView) this.findViewById(R.id.logText); editUrl = (TextView) findViewById(R.id.editUrlId); editTime = (TextView) findViewById(R.id.editTimeId); commitBtn = (Button) findViewById(R.id.commitId); getLocation(); /** * */ commitBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String m = ""; url = editUrl.getText().toString(); if (!"".equals(url)) { url = url + "&lgt=${lgt}&lat=${lat}"; m = " url :" + url + "
    "; } String time = editTime.getText().toString(); if (!"".equals(time) && time != null) { boolean isNum = time.matches("[0-9]+"); if (isNum) { period = Integer.valueOf(time) * 1000; m = m + " :" + editTime.getText().toString() + " "; } } if (!"".equals(m)) { Toast.makeText(MainActivity.this, m, Toast.LENGTH_LONG) .show(); } } }); } private void getLocation() { lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // GPS if (!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) { Toast.makeText(this, " GPS ...", Toast.LENGTH_SHORT).show(); setLog(" GPS ..."); // GPS Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivityForResult(intent, 0); return; } // String bestProvider = lm.getBestProvider(getCriteria(), true); // // ,getLastKnownLocation LocationManager.GPS_PROVIDER Location location = lm.getLastKnownLocation(bestProvider); updateView(location); /** * */ lm.addGpsStatusListener(listener); /** * , 4 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(), */ if (lm.getProvider(LocationManager.GPS_PROVIDER) != null) { Log.d("GPS_PROVIDER :", "GPS 。。。。。。。。"); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, locationListener); } else if (lm.getProvider(LocationManager.NETWORK_PROVIDER) != null) { Log.d("NETWORK :", "NETWORK 。。。。。。。。"); lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, minTime, minDistance, locationListener); } } // private LocationListener locationListener = new LocationListener() { /** * */ public void onLocationChanged(Location location) { setLog(" :" + location.getLongitude() + "
    :" + location.getLatitude()); updateView(location); } /** * GPS */ public void onStatusChanged(String provider, int status, Bundle extras) { switch (status) { // GPS case LocationProvider.AVAILABLE: Log.i(TAG, " GPS "); setLog(" GPS "); break; // GPS case LocationProvider.OUT_OF_SERVICE: Log.i(TAG, " GPS "); setLog(" GPS "); break; // GPS case LocationProvider.TEMPORARILY_UNAVAILABLE: Log.i(TAG, " GPS "); setLog(" GPS "); break; } } /** * GPS */ public void onProviderEnabled(String provider) { Location location = lm.getLastKnownLocation(provider); updateView(location); } /** * GPS */ public void onProviderDisabled(String provider) { updateView(null); } }; // GpsStatus.Listener listener = new GpsStatus.Listener() { public void onGpsStatusChanged(int event) { switch (event) { // case GpsStatus.GPS_EVENT_FIRST_FIX: Log.i(TAG, " "); setLog(" "); break; // case GpsStatus.GPS_EVENT_SATELLITE_STATUS: long currenMillis = System.currentTimeMillis();// if ((currenMillis - lastMillis) > period) { uploadUrl(); lastMillis = currenMillis; // GpsStatus gpsStatus = lm.getGpsStatus(null); // int maxSatellites = gpsStatus.getMaxSatellites(); // Iterator iters = gpsStatus.getSatellites() .iterator(); int count = 0; while (iters.hasNext() && count <= maxSatellites) { count++; } Log.i(TAG, " , :" + count + " "); setLog(" , :" + count + "
    :" + longitude + "
    :" + latitude); } break; // case GpsStatus.GPS_EVENT_STARTED: Log.i(TAG, " "); setLog(" "); break; // case GpsStatus.GPS_EVENT_STOPPED: Log.i(TAG, " "); setLog(" "); break; } } private void uploadUrl() { if (!"".equals(url) && url != null) { if (!"".equals(longitude) && !"".equals(latitude)) { uploadHttp(); } } }; }; /** * * * @param location */ private void updateView(Location location) { if (location != null) { longitude = String.valueOf(location.getLongitude()); latitude = String.valueOf(location.getLatitude()); Log.i(TAG, String.valueOf(location.getLongitude())); } else { Log.i(TAG, " "); } // editText.append("
    :" + new Date()); } private void uploadHttp() { url = url.replace("${lgt}", longitude).replace("${lat}", latitude); urlInfoId.setText(url); HttpUtils http = new HttpUtils(); http.send(HttpMethod.GET, url, new RequestCallBack() { @Override public void onFailure(HttpException arg0, String arg1) { resultInfoId.setText(" :
    " + arg1); } @Override public void onSuccess(ResponseInfo arg0) { currentTime.setText(" :" + format.format(new Date())); resultInfoId.setText(" :
    "+arg0.result); } }); } /** * * * @return */ private Criteria getCriteria() { Criteria criteria = new Criteria(); // Criteria.ACCURACY_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; } }

    リアルタイム位置決めの更新などの詳細については、android位置決め:現在の位置の緯度を取得するを参照してください.