GPSDmeo

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


一、首先判断并提示用户 是否开启GPS硬件设备


package com.example.hejingzhou.gpsdemo;

import android.content.Context;
import android.location.LocationManager;
import android.util.Log;

/**
 * Created by Hejingzhou on 2016/2/28.
 */
public class OpenGPS {
    public static boolean isOPen = false;
    public static String strIsOpen ;
    private String TAG = this.getClass().getSimpleName();
    Context context;

    public static String getStrIsOpen() {
        return strIsOpen;
    }

    public void OpenGps(Context context){
        this.context = context;
        LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);//创建位置管理对象并且获取位置的系统服务
        if(locationManager.isProviderEnabled(locationManager.GPS_PROVIDER)){
            Log.i(TAG,"GPS模块已经打开");
            isOPen = true;
            strIsOpen = "GPS已经打开";
            return;
        }else {
            Log.i(TAG,"请打开GPS模块");
            isOPen = false;
            strIsOpen = "GPS未开启,请手动开启GPS";
            /*Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivityForResult(intent,0);*///按说是这样做如果没有打开GPS就会跳转到开启GPS的界面但是我的startActivityForResult参数有问题

        }
    }




}


二、MainActivity

package com.example.hejingzhou.gpsdemo;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
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.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.TextView;
import android.widget.Toast;

import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {
    private String TAG = "MainActivity";
    private long ExitTime;//双击back退出时间标量
   /* GpsStatus gpsStatus;
    GpsStatus.Listener gpListener;
    int firstTime ;
    int maxSatellites;*/

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        OpenGPS openGPS = new OpenGPS();
        openGPS.OpenGps(this);
        Toast.makeText(MainActivity.this, OpenGPS.getStrIsOpen(), Toast.LENGTH_SHORT).show();
        if (OpenGPS.getStrIsOpen().equals("GPS已经打开")) {
           getLocation();
        } else {
            return;
        }
    }
    private void getLocation() {
        /**
         * 获取位置管理服务
         */
        final LocationManager locationManager;
        String serviceName = Context.LOCATION_SERVICE;
        locationManager = (LocationManager) this.getSystemService(serviceName);
        /**
         * 查找到服务信息
         *
         * A class indicating the application criteria for selecting a
         * location provider.  Providers maybe ordered according to accuracy,
         * power usage, ability to report altitude, speed,
         * and bearing, and monetary cost.
         */
         /*

        gpListener = new GpsStatus.Listener() {
            @Override
            public void onGpsStatusChanged(int event) {
               gpsStatus = locationManager.getGpsStatus(null);
                if(event == GpsStatus.GPS_EVENT_FIRST_FIX){

                    firstTime = gpsStatus.getTimeToFirstFix();Log.i(TAG, "第一次耗时" + firstTime);
                    Toast.makeText(MainActivity.this,"耗时"+String.valueOf(firstTime),Toast.LENGTH_LONG).show();
                    maxSatellites = gpsStatus.getMaxSatellites();Log.i(TAG,"卫星数"+maxSatellites);

                }
            }
        };
     */

        /**
         * Criteria类表示应用程序选择一个标准位置提供者。供应商可能要求根据精度,用电,能力报告高度,速度,和方向,费用
         */
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);//高精度
        criteria.setAltitudeRequired(true);//设置Provider是否需要高度信息。海拔
        criteria.setBearingRequired(true);//设置Provider是否需要方位信息。方向
        criteria.setSpeedRequired(true);//允许访问速度
        criteria.setCostAllowed(true);//设置Provider是否产生费用
        criteria.setPowerRequirement(Criteria.POWER_HIGH);//设置电量消耗等级
        String provider = locationManager.getBestProvider(criteria, true);//	根据Criteria返回最适合的LocationProvider
        /**
         * 判断权限是否允许
         */
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    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;
        }
        Location location = locationManager.getLastKnownLocation(provider);//通过GPS进行定位
        updataToNewLocation(location);
        /**
         * 设置监听器,自动更新最小的时间为间隔N秒(1秒 = 1*1000)
         */
        locationManager.requestLocationUpdates(provider,3000,1,locationListener);
    }

    private void updataToNewLocation(Location location){
        TextView textView1;
        textView1 = (TextView)this.findViewById(R.id.GPS_State);
        if(location != null){
            double lon = location.getLongitude();Log.i(TAG, "经度 " + lon);
            double lat = location.getLatitude();Log.i(TAG, "纬度 " + lat);
            double high = location.getAltitude();Log.i(TAG, "海拔 " + high);
            float accuracy = location.getAccuracy();Log.i(TAG, "精确度:" + accuracy);
            double speed = location.getSpeed();Log.i(TAG,"速度 " + speed);
            double direction = location.getBearing();Log.i(TAG,"方向:"+direction);
            long time = location.getTime();Log.i(TAG, "时间 " + time);
            String provider = location.getProvider();Log.i(TAG,"提供者"+provider);


            SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日  HH:mm:ss");
            Date date = new Date(time+(28800000));//8小时*60分钟*60秒*1000毫秒
            String TIME;
            TIME = format.format(date);

            textView1.setText("经度:" + lon + "\n纬度:" + lat + "\n海拔:" + high + "\n速度:" + speed + "\n时间:"
                    + TIME+"\n方向:"+direction+"\n精确度:"+String.valueOf(accuracy)+"\n数据提供者:"+provider/*+"\n定位耗时:"+firstTime+"\n卫星:"+maxSatellites*/);

        }else {textView1.setText("没有位置信息!!!");}
    }

    private final LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            if(location != null){
                Log.i(TAG,""+location.getLatitude()+location.getLongitude());
            }
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {}
        @Override
        public void onProviderEnabled(String provider) {}
        @Override
        public void onProviderDisabled(String provider) {}
    };

    /**
     * 双击Back退出
     * @param keyCode
     * @param event
     * @return
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK){
            if((System.currentTimeMillis() - ExitTime)>2000){
                Toast.makeText(MainActivity.this,"再按一次退出程序",Toast.LENGTH_SHORT).show();
                ExitTime = System.currentTimeMillis();
            }else {
                finish();
                onDestroy();
                System.exit(0);
            }
            return  true;
        }
        return super.onKeyDown(keyCode, event);
    }
}



还有一些方法没用 ,今天不想弄了。

下边是GpsStatus类中的:

获取首次连接GPS的耗时  public int getTimeToFirstFix()

获取最大卫星数量     public int getMaxStatellites()

获取GPS的卫星状态   public iterable<GpsStatellite> getStatellies()

下边是GpsStatellite类:

获取方位角    public  float getAzimuth()

获取高度角    public float getElevation()

获取伪随机数  public int getprm()

获取信噪比  publci float getSnr()

 

源代码:

http://download.csdn.net/detail/csdnhejingzhou/9448489

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值