2017-11-22 17 views
-1

チャオ!私は現在の場所が必要なアクティビティを持っているので、ユーザーはどのオブジェクトが近くにいるのかを見ることができます。Android - 場所を取得する最も簡単な方法

GoogleApiClient、FusedLocation、コールバックなどに夢中になります。唯一の結果は、getLastLocationnullです。

マイアクティビティGoogleApiClient.ConnectionCallbacksGoogleApiClient.OnConnectionFailedListenerを実装しています。私もこれ持って

private void getLocation(){ 
    locationRequest = LocationRequest.create(); 
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    locationRequest.setInterval(60*1000); 
    locationRequest.setFastestInterval(10*1000); 
    mFusedLocationApi = LocationServices.FusedLocationApi; 
    gApiClient = new GoogleApiClient.Builder(this) 
      .addApi(LocationServices.API) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .build(); 
    if (gApiClient != null) { 
     gApiClient.connect(); 
    } 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    if (gApiClient != null) { 
     gApiClient.connect(); 
    } 
} 

@Override 
protected void onStop() { 
    gApiClient.disconnect(); 
    super.onStop(); 
} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 
    Log.w("ADVSEARCH","Error on connection failed"); 
} 

@Override 
public void onConnectionSuspended(int i) { 
    Log.w("ADVSEARCH","Error on connection suspended"); 
} 

@Override 
public void onConnected(Bundle bundle) { 
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 

     //lastlocation = LocationServices.FusedLocationApi.getLastLocation(gApiClient); 


     mFusedLocationApi.requestLocationUpdates(gApiClient, locationRequest, new com.google.android.gms.location.LocationListener() { 
      @Override 
      public void onLocationChanged(Location location) { 
       lastlocation = location; 
      } 
     }); 
    } 
    lastlocation = LocationServices.FusedLocationApi.getLastLocation(gApiClient); 
} 

をとはい、OnCreateに私はアクセス権のチェック、このようなものです私はgetLocation()呼び出すOnCreate

。最小API 16、ターゲットAPI 25. ヌルオブジェクトでdistanceToを使用しているため、初めてクラッシュするときにアプリケーションを開く。私は何が欠けていますか?私が検索するほど、私はもっと混乱します。

+0

「私はアプリを開くたびに、私はnullオブジェクトに 'distanceTo'を使用しているため、それがクラッシュした最初の時間を」 - あなたは'で) 'distanceToを(使用していません質問のあなたのコードリスト。 – CommonsWare

+0

@CommonsWareそれは単に 'clickListener'の' distanceTo() 'ですが、他の関連する行はありません。私は場所に関するコードしか書いていません。私は 'distanceTo()'の前にロギングするので、 'lastLocation'がnullであることを知っています。 – tuzzo

+2

まあ、 'getLastLocation()'は 'null'を返すことができます。 'lastLocation'は、' getLastLocation() 'または' onLocationChanged() 'によって設定されるまで使用しないでください。たとえば、非ヌル位置になるまでそのボタンを無効にすることができます。 – CommonsWare

答えて

1

私はそれが違うかもしれないと思います。マニフェストファイルにすべてのものを設定していないか、実行時に権限がありません(アプリケーションの最初の起動時にこれを許可する必要があります。または、これをアプリケーション設定で手動で設定する必要があります)。あなたがアクセス権をまだ設定してgetLocationRequestを呼び出す必要はありませんでした場合、これはあなたの尋ねるActivity.java

private static final int PERMISSION_REQUEST_FINE_LOCATION = 1; 

private void getLocationRequest() { 
    FusedLocationProviderClient client = LocationServices.getFusedLocationProviderClient(this); 
    if (!checkPermission()) { 
     getLocationPermissions(); 
     return; 
    } 
    client.getLastLocation() 
      .addOnSuccessListener(this, new OnSuccessListener<Location>() { 
       @Override 
       public void onSuccess(Location location) { 
        // Got last known location. In some rare situations this can be null. 
        if (location != null) { 
         // Logic to handle location object 
         Log.e("TAG", "location = " + location); 
        } else { 
         Log.e("TAG", "not successful"); 
        } 
       } 
      }); 
} 

private boolean checkPermission() { 
    return isGranted(ActivityCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION)) && 
      isGranted(ActivityCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION)); 
} 

@TargetApi(Build.VERSION_CODES.M) 
private void getLocationPermissions() { 
    requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 
      PERMISSION_REQUEST_FINE_LOCATION); 
} 

@Override 
public void onRequestPermissionsResult(int code, @Nullable String permissions[], @Nullable int[] results) { 
    switch (code) { 
     case PERMISSION_REQUEST_FINE_LOCATION: 
      if (isPermissionGranted(results)) { 
       getLocationRequest(); 
      } 
    } 
} 

private boolean isPermissionGranted(int[] results) { 
    return results != null && results.length > 0 && isGranted(results[0]); 
} 

private boolean isGranted(int permission) { 
    return permission == PackageManager.PERMISSION_GRANTED; 
} 

build.gradle

implementation 'com.google.android.gms:play-services-location:11.6.0' 

...これを試してみてくださいもう一度肯定的なダイアログの結果を返します。

そして、あなたはあなたののAndroidManifest.xml、あなたのニーズに合うように持っている原因の

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

<uses-feature android:name="android.hardware.location.gps" /> 
<uses-feature android:name="android.hardware.location.network" /> 

(罰金または粗い場所など)でこれを持っているかどうかを確認します。

これはトラックにあなたを取得希望;)

+0

またはこの非常にpainleesライブラリhttps://github.com/mrmans0n/smart-location-libを使用することができます。 – ingyesid

+0

私はすべてを削除しましたが、あなたのコードでは、動作するように見えます。ありがとうございました! – tuzzo

+0

@tuzzo有用であれば私の答えを受け入れるように自由に感じてください;) –

関連する問題