Androidは原生APiで位置の経緯度を取得

47305 ワード

Androidが原生APiで位置の経緯度を取得することを紹介した.シーン:ユーザーappのホームページを追加した後、ユーザーの緯度を1つのインタフェースを通じてサービス側に戻し、サーバーを正確に位置決めすることができます.
ステップ分析:
  • 権限の問題:Android 6.0以降にダイナミック権限が追加されましたが、緯度座標を取得する権限を取得appの(TargetVersion>=23)場合はダイナミック取得が必要です(もちろんリストファイルにも設定しなければなりません)
  • コード実装(詳細は後述)
  • 一、権限構成
  • インベントリファイル権限
  •     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    
  • 2権限申請コード
  •   public class MainActivity extends AppCompatActivity {
     
      private static final int LOCATION_CODE = 1;
      private LocationManager lm;//    
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );
        //       
        GPSQunaxian();
      }
     
      /**
        *        
        */
      public void GPSQunaxian(){
            lm = (LocationManager) MainActivity.this.getSystemService(MainActivity.this.LOCATION_SERVICE);
            boolean ok = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
            if (ok) {//      
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)
                        != PackageManager.PERMISSION_GRANTED) {
                    Log.d("kly","    ");
                    //     ,    。
                    //     。
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_CODE);
                    //Toast.makeText(getActivity(), "    ", Toast.LENGTH_SHORT).show();
    
                } else {
                    //     ,    。
                    //Toast.makeText(getActivity(), "   ", Toast.LENGTH_SHORT).show();
                }
            } else {
                Log.d("kly","d        GPS    ");
                Toast.makeText(MainActivity.this, "        GPS    ", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivityForResult(intent, 1315);
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            switch (requestCode) {
                case LOCATION_CODE: {
                    if (grantResults.length > 0
                            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        //        。
    
                    } else {
                        //         。
                        Toast.makeText(MainActivity.this, "       ,          !",Toast.LENGTH_LONG).show();
                    }
    
                }
            }
        }
    }
    

    二、工具類
    package com.gentek.tianlin12.utils;
    
    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.Build;
    import android.os.Bundle;
    import android.support.v4.app.ActivityCompat;
    import android.util.Log;
    import java.util.List;
    
    /**
     * Created by Administrator on 2018/4/17.
     *          
     */
    public class GPSUtils {
    
        private static GPSUtils instance;
        private LocationManager locationManager;
        private String locationProvider;
        private Location location;
        private Context mContext;
    
        private GPSUtils(Context context) {
            this.mContext = context;
            getLocation();
        }
    
        public static GPSUtils getInstance(Context context) {
            if (instance == null) {
                synchronized (GPSUtils.class) {
                    if (instance == null) {
                        instance = new GPSUtils(context);
                    }
                }
            }
            return instance;
        }
        private void getLocation() {
            //1.       
            locationManager = (LocationManager) mContext.getSystemService( Context.LOCATION_SERVICE );
            //2.       ,GPS  NetWork
            List<String> providers = locationManager.getProviders( true );
            if (providers.contains( LocationManager.NETWORK_PROVIDER )) {
                //       
                Log.d( "kly", "       " );
                locationProvider = LocationManager.NETWORK_PROVIDER;
            } else if (providers.contains( LocationManager.GPS_PROVIDER )) {
                //   GPS  
                Log.d( "kly", "   GPS  " );
                locationProvider = LocationManager.GPS_PROVIDER;
            } else {
                Log.d( "kly", "          " );
                return;
            }
            //       ,      ,         ,     。       code  。
            if (Build.VERSION.SDK_INT >= 23 &&
                    ActivityCompat.checkSelfPermission( mContext, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
                    ActivityCompat.checkSelfPermission( mContext, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
    
            //3.       ,       ,   null
            Location location = locationManager.getLastKnownLocation( locationProvider );
            if (location != null) {
                setLocation( location );
            }else {
                Log.d("kly","location=null");
            }
            //         ,                   minTime     minDistace
            locationManager.requestLocationUpdates( locationProvider, 0, 0, locationListener );
        }
        private void setLocation(Location location) {
            this.location = location;
            String address = "  :" + location.getLatitude() + "  :" + location.getLongitude();
            Log.d( "kly", "address"+address );
        }
    
        //     
        public Location showLocation() {
            return location;
        }
    
        //       
        public void removeLocationUpdatesListener() {
            //       ,      
            if (Build.VERSION.SDK_INT >= 23 &&
                    ActivityCompat.checkSelfPermission( mContext, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
                    ActivityCompat.checkSelfPermission( mContext, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            if (locationManager != null) {
                instance = null;
                locationManager.removeUpdates( locationListener );
            }
        }
    
        /**
         * LocationListern   
         *   :       、           、         、LocationListener   
         */
    
        LocationListener locationListener = new LocationListener() {
    
            /**
             *                 
             */
            @Override
            public void onStatusChanged(String provider, int status, Bundle arg2) {
    
            }
    
            /**
             *        
             */
            @Override
            public void onProviderEnabled(String provider) {
    
            }
    
            /**
             *        
             */
            @Override
            public void onProviderDisabled(String provider) {
    
            }
    
            /**
             *         
             */
            @Override
            public void onLocationChanged(Location location) {
                location.getAccuracy();//   
                setLocation(location);
            }
        };
    }
    

    三、完全なコード
      public class MainActivity extends AppCompatActivity {
     
      private static final int LOCATION_CODE = 1;
      private LocationManager lm;//    
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );
        //       
        GPSQunaxian();
        Location location = GPSUtils.getInstance( MainActivity.this ).showLocation();
        if (location != null) {
                String address = "  :" + location.getLatitude() + "  :" + location.getLongitude();
                Log.d( "kly",address );
                Toast.makeText(MyApplication.getContext(),address,Toast.LENGTH_SHORT).show();
        }
      }
     
      /**
        *        
        */
      public void GPSQunaxian(){
            lm = (LocationManager) MainActivity.this.getSystemService(MainActivity.this.LOCATION_SERVICE);
            boolean ok = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
            if (ok) {//      
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)
                        != PackageManager.PERMISSION_GRANTED) {
                    Log.d("kly","    ");
                    //     ,    。
                    //     。
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_CODE);
                    //Toast.makeText(getActivity(), "    ", Toast.LENGTH_SHORT).show();
    
                } else {
                    //     ,    。
                    //Toast.makeText(getActivity(), "   ", Toast.LENGTH_SHORT).show();
                }
            } else {
                Log.d("kly","d        GPS    ");
                Toast.makeText(MainActivity.this, "        GPS    ", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivityForResult(intent, 1315);
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            switch (requestCode) {
                case LOCATION_CODE: {
                    if (grantResults.length > 0
                            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        //        。
    
                    } else {
                        //         。
                        Toast.makeText(MainActivity.this, "       ,          !",Toast.LENGTH_LONG).show();
                    }
    
                }
            }
        }
        
        @Override
        protected void onDestroy() {
            super.onDestroy();
            GPSUtils.getInstance( this ).removeLocationUpdatesListener();
        }
    }
    

    以上が本文のすべての内容で、みんなの学习に対して役に立つことを望みます