2017-01-25 6 views
-1

Я новичок в разработке для Android. Для понимания, я разрабатываю приложение, которое покажет мне gps местоположение меня. Для этого я обыскал в Интернете и нашел два учебника.Проблема с настройкой GPS в андроид-студии

Я следую Link1, и последовал за каждый шаг в этом, пыльник код, который я написал.

GPSTracker.java

import android.Manifest; 
import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.IBinder; 
import android.support.annotation.Nullable; 
import android.support.v4.app.ActivityCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.provider.Settings; 


public class GPSTracker extends Service implements LocationListener { 

private final Context mContext; 

// flag for GPS status 
boolean isGPSEnabled = false; 
// flag for network status 
boolean isNetworkEnabled = false; 

boolean canGetLocation = false; 

Location location; // location 
double latitude; // latitude 
double longitude; // longitude 

// The minimum distance to change Updates in meters 
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 5; // 5 meters 

// The minimum time between updates in milliseconds 
private static final long MIN_TIME_BW_UPDATES = 10000; // 10 seconds 

// Declaring a Location Manager 
protected LocationManager locationManager; 

public GPSTracker(Context mContext) { 
    this.mContext = mContext; 
} 

public Location getLocation() { 
    try { 
     locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); 

     // getting GPS status 
     isGPSEnabled = locationManager 
       .isProviderEnabled(LocationManager.GPS_PROVIDER); 

     // getting network status 
     isNetworkEnabled = locationManager 
       .isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

     if (!isGPSEnabled && !isNetworkEnabled) { 
      Log.i("", "Network Value: " + isNetworkEnabled); 
      Log.i("", "GPS Value: " + isGPSEnabled); 
      // no network provider is enabled 
     } else { 
      this.canGetLocation = true; 
      // First get location from Network Provider 
      if (isNetworkEnabled) { 
       locationManager.requestLocationUpdates(
         LocationManager.NETWORK_PROVIDER, 
         MIN_TIME_BW_UPDATES, 
         MIN_DISTANCE_CHANGE_FOR_UPDATES, 
         this 
       ); 
       Log.d("Network", "Network"); 
       if (locationManager != null) { 

        location = locationManager 

          .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

        if (location != null) { 

         latitude = location.getLatitude(); 

         longitude = location.getLongitude(); 

        } 

       } 

    /*     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; 

        }*/ 
      } 
      if (isGPSEnabled) { 
       if (location == null) { 
        locationManager.requestLocationUpdates(
          LocationManager.GPS_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        Log.d("GPS Enabled", "GPS Enabled"); 
        if (locationManager != null) { 
         location = locationManager 
           .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
        } 
        if (location != null) { 
         latitude = location.getLatitude(); 
         longitude = location.getLongitude(); 
        } 
       } 
      } 
     } 
    } catch (Exception e) { 

     e.printStackTrace(); 
     Log.i("", "Exception " + e); 

    } 
    return location; 
} 

/** 
* Stop using GPS listener 
* Calling this function will stop using GPS in your app 
* */ 
public void stopUsingGPS() { 
    if (locationManager != null) { 
     /*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; 
     }*/ 
     locationManager.removeUpdates(GPSTracker.this); 
    }} 

/** 
* Function to get latitude 
* */ 
public double getLatitude(){ 
    if(location != null){ 
     latitude = location.getLatitude(); 
    } 

    // return latitude 
    return latitude; 
} 

/** 
* Function to get longitude 
* */ 
public double getLongitude(){ 
    if(location != null){ 
     longitude = location.getLongitude(); 
    } 

    // return longitude 
    return longitude; 
} 

/** 
* Function to check GPS/wifi enabled 
* @return boolean 
* */ 
public boolean canGetLocation() { 
    return this.canGetLocation; 
} 

/** 
* Function to show settings alert dialog 
* On pressing Settings button will lauch Settings Options 
* */ 
public void showSettingsAlert(){ 
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

    // Setting Dialog Title 
    alertDialog.setTitle("GPS is settings"); 

    // Setting Dialog Message 
    alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?"); 

    // On pressing Settings button 
    alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog,int which) { 
      Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
      mContext.startActivity(intent); 
     } 
    }); 

    // on pressing cancel button 
    alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel(); 
     } 
    }); 

    // Showing Alert Message 
    alertDialog.show(); 
} 

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

@Override 
public void onLocationChanged(Location location) { 

} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 

} 

@Override 
public void onProviderEnabled(String provider) { 

} 

@Override 
public void onProviderDisabled(String provider) { 

}} 

пыльник мой основной код деятельности

MainActivity.java

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import android.app.Activity; 

public class MainActivity extends Activity { 
Button btnShowLocation; 
TextView textShowLocation; 
// GPSTracker class 
GPSTracker gps; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    btnShowLocation = (Button) findViewById(R.id.btnShowLocation); 
    // show location button click event 
    btnShowLocation.setOnClickListener(new View.OnClickListener(){ 


     @Override 
     public void onClick(View v) { 
      // create class object 
      gps = new GPSTracker(MainActivity.this); 
      // need to make canGetLocation flag true by calling below method as per your code. 
      **gps.getLocation()** 
      // check if GPS enabled 
      if(gps.canGetLocation()){ 
       double latitude = gps.getLatitude(); 
       double longitude = gps.getLongitude(); 
       textShowLocation.append("Your Location is - \nLat: " + latitude+ "\nLong: " + longitude); 
      } 
      else 
      { 
       // can't get location 
       // GPS or Network is not enabled 
       // Ask user to enable GPS/network in settings 
       gps.showSettingsAlert(); 
      } 
     } 
    }); 



} 

Update 1

Ниже мой манифест код:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.accurat.tracker"> 
<uses-sdk android:minSdkVersion="8" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

Во время работы приложения в устройство, всякий раз, когда я нажимаю кнопку show location всегда перенаправляет меня на else части т.е. gps.showSettingsAlert(); перспективы. Независимо от того, включен ли «GPS» моего устройства, он все еще не показывает мне местоположение. Более того, комментарий или отказ от комментариев permission check не помогает.

Любая помощь будет высоко оценен:

+2

Правильно ли вы установили права на «манифест»? –

+0

@ThisaruGuruge любезно см. 'Update 1' – faisal1208

+0

Вы пытались использовать несколько устройств? – Amy

ответ

1

вам нужно вызвать getLocation(); метод в конструкторе:

public GPSTracker(Context mContext) { 
    this.mContext = mContext; 
    getLocation(); 
} 

в классе GPSTracker добавить этот код:

@Override 
public void onLocationChanged(Location location) { 
    this.location = location; 
    getLatitude(); 
    getLongitude(); 
} 

Также класс у используете есть некоторые проблемы: см этот блог http://gabesechansoftware.com/location-tracking/

вы можете использовать FusedLocationApi

приведен пример: http://www.androidwarriors.com/2015/10/fused-location-provider-in-android.html

+0

Реализовав вашу логику, теперь на кнопку «нажмите кнопку» приложение приложения отключится и дает мне сообщение «К сожалению, Tracker остановился» – faisal1208

+0

Что говорит ошибка logcat? – rafsanahmad007

+0

Это дает мне эту ошибку в logcat 'FATAL EXCEPTION: main Процесс: com.example.accurat.tracker, PID: 10668 java.lang.NullPointerException: попытка вызвать виртуальный метод 'void android.widget.TextView.append (java .lang.CharSequence) 'в ссылке нулевого объекта' – faisal1208

0

, если вы используете версию 5.0+ затем добавить

< использует функцию-андроид: имя = "android.hardware.location.gps" />

к вашему манифесту. и если вы тестируете на зефир, вы должны добавить

int REQUEST_CODE_PERMISSION=101; 
    void allowGPS() { 
      try { 
       if (Build.VERSION.SDK_INT >= 23 { 
        Log.i("*******", "check build permission"); 
        try { 
         if (getApplicationContext().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
          if (ActivityCompat.shouldShowRequestPermissionRationale(LoginActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)) { 
           // permission wasn't granted 
          } else { 
           ActivityCompat.requestPermissions(LoginActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_PERMISSION); 
          } 
         } 
        } catch (Exception ae) { 

        } 
       } 
      } catch (Exception ae) { 
       ae.printStackTrace(); 
      } 
     } 



@Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     if (requestCode == REQUEST_CODE_PERMISSION) { 
      if (grantResults.length >= 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       // permission was granted 
      } else { 
       // permission wasn't granted 
      } 
     } 
    } 
0

GPSTracker класс обслуживания. Вам нужно запустить службу, чтобы получить место. Теперь еще условие показывает, потому что местоположение еще не выбрано. Вы можете запустить службу по startService(new Intent(context, GPSTracker.class));

также изменить код кнопки щелчка по этому

LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

    if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){ 
     Toast.makeText(this, "GPS is Enabled in your devide", Toast.LENGTH_SHORT).show(); 
    }else{ 
     showGPSDisabledAlertToUser(); 
    }