2017-02-09 6 views
0

Я пытаюсь написать приложение Android, очевидно, которое использует местоположение пользователя, чтобы поместить маркер на активность карты или в этом случае напечатать широту и долготу. Однако я не могу найти учебник или предыдущий вопрос, который работает для меня. Я ищу самый простой способ получить текущее местоположение пользователя, используя gps, в виде объекта местоположения, широты и долготы. Мой текущий код выглядит следующим образом, непосредственно из this tutorial:Получить текущее местоположение gps android studio

public class MainActivity extends AppCompatActivity 
     implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener { 
    private TextView lat, lng; 
    private GoogleApiClient mGoogleApiClient; 
    private Location mCurrentLocation; 
    private boolean mRequestingLocationUpdates; 
    private LocationRequest mLocationRequest; 

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

     lat = (TextView) findViewById(R.id.lat); 
     lng = (TextView) findViewById(R.id.lng); 

     // Create an instance of GoogleAPIClient. 
     if (mGoogleApiClient == null) { 
      mGoogleApiClient = new GoogleApiClient.Builder(this) 
        .addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this) 
        .addApi(LocationServices.API) 
        .build(); 
     } 
    } 

    protected void onStart() { 
     mGoogleApiClient.connect(); 
     super.onStart(); 
    } 

    protected void onStop() { 
     mGoogleApiClient.disconnect(); 
     super.onStop(); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     if (mGoogleApiClient.isConnected() && !mRequestingLocationUpdates) { 
      startLocationUpdates(); 
     } 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     stopLocationUpdates(); 
    } 

    protected void stopLocationUpdates() { 
     LocationServices.FusedLocationApi.removeLocationUpdates(
       mGoogleApiClient, this); 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(
       mGoogleApiClient); 
     if (mCurrentLocation != null) { 
      lat.setText(String.valueOf("Lat: " + mCurrentLocation.getLatitude())); 
      lng.setText(String.valueOf("Lng: " + mCurrentLocation.getLongitude())); 
     } 
     else 
      Log.i("Problem", "mCurrentLocation is null"); 

     if (mRequestingLocationUpdates) { 
      startLocationUpdates(); 
     } 
    } 

    protected void startLocationUpdates() { 
     LocationServices.FusedLocationApi.requestLocationUpdates(
       mGoogleApiClient, mLocationRequest, this); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     mCurrentLocation = location; 
     updateUI(); 
    } 

    private void updateUI() { 
     lat.setText(String.valueOf("Lat: " + mCurrentLocation.getLatitude())); 
     lng.setText(String.valueOf("Lng: " + mCurrentLocation.getLongitude())); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    } 
} 

и мой AndroidManifest.xml является:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.root.locationtest"> 

    <meta-data android:name="com.google.android.gms.version" 
     android:value="@integer/google_play_services_version" /> 

    <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="LocationTest" 
     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> 

</manifest> 

Я всегда кажется, чтобы получить сообщение журнала «mCurrentLocation является нулевой», поэтому нет ничего в изменения приложения. В строке mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); есть предупреждение: «Требуется разрешение, которое может быть отклонено пользователем». Любая помощь приветствуется, спасибо заранее.

EDIT: Я окружил все строки с «Зов требуется разрешение, которое может быть отвергнуто пользователем» с заявлением, если:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == 
       PackageManager.PERMISSION_GRANTED) 

, который устраняет это предупреждение. Тем не менее, разрешение отклоняется в методе onConnect(), а mCurrentLocation все равно null.

+0

Добавить файл AndroidManifest.xml – user2025187

+0

просто попробуйте выполнить мой учебник в этом ответе. Это поможет вам получить текущее местоположение, широту, долготу, а также обновит текущую широту и долготу в реальном времени. http://stackoverflow.com/a/42131361/4201474 – TranHieu

ответ

0

Для вызова требуется разрешение, которое может быть отклонено пользователем. эта ошибка связана с более высокой версией Android, которая требуется для получения разрешения от пользователя во время выполнения. Просто объявление в манифест не помогло бы. Поэтому вам нужно добавить код для разрешений.

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; 
    } 
Смежные вопросы