2017-09-29 28 views
26

なぜ「LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest, this);」が「FusedLocationApi」になっているのかわかりませんでした。 Click here to view ImageAndroid LocationServices.FusedLocationApi非推奨

import android.location.Location; 
import android.location.LocationListener; 
import android.support.annotation.NonNull; 
import android.support.annotation.Nullable; 
import android.support.v4.app.FragmentActivity; 
import android.os.Bundle; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 

public class MaintainerMapActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener{ 

private GoogleMap mMap; 
GoogleApiClient mGoogleApiClient; 
Location mLastLocaton; 
LocationRequest mLocationRequest; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_maintainer_map2); 
    // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); 
} 


@Override 
public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 

    // Add a marker in Sydney and move the camera 
    LatLng sydney = new LatLng(-34, 151); 
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); 
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); 
} 

@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) { 

} 

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(1000); 
    mLocationRequest.setFastestInterval(1000); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 

    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest, this); 
} 

@Override 
public void onConnectionSuspended(int i) { 

} 

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

} 

}

+0

これは推奨されていませんが、これは私がこのLocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient、mLocationRequest、this)を使用していることを確認してください。 –

+0

あなたの質問を説明できますか –

+0

@OmarHayat FusedLocationApiはクロスオーバーです – vvvv

答えて

61

最新の更新(11月21日):警告は、現在行っています。Google Play services 11.6 November 6, 2017, release noteさんのコメント:Fixed FusedLocationProviderClient issue that occasionally caused crashes when Google Play services updated.バックグラウンドで自身を更新するとPlayサービスがクラッシュしないと思います。だから我々は今新しいFusedLocationProviderClientを使うことができる。

重要UPDATE(10月24日):**昨日、Googleがa warningとの公式開発者のページを更新し

がFusedLocationProviderApiクラスを使用し続けるとまでFusedLocationProviderClientクラスに移行しないでくださいと言います2018年に出荷予定のGoogle Playサービスバージョン12.0.0をご利用いただけます。バージョン12.0.0より前のFusedLocationProviderClientを使用すると、Google Playサービスが端末で更新されるとクラッシュする可能性があります。ご迷惑をおかけしましたことをお詫び申し上げます。

enter image description here だから私は、Googleが問題を解決するまで、私たちは非推奨LocationServices.FusedLocationApiを使用し続けるべきだと思います。

オリジナル回答

FusedLocationProviderApiは、Google Playのサービスの最新バージョンでは非推奨ため、これが起こっています。あなたはそれを確認することができますhere。公式ガイドでは、FusedLocationProviderClientを使用することを提案しています。詳細なガイドhereがあります。 onCreate()内部例えばため

FusedLocationProviderClientインスタンス

mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); 

と最後の既知の位置を要求するために作成し、あなたがしなければならないすべては、単純な、それコール

mFusedLocationClient.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 
      } 
     } 
    }); 

がないのですか?

+0

ありがとうございました。 – vvvv

+0

笑周りを見回しています回答としてマークする方法がわからないXD – vvvv

+0

@vvvv答えとしてマークしてはいけませんか?近い将来に多くの人がこの問題に直面するだろうと私は確信しています。あなたの質問は、この答えが正しい解決策を見つけるのに役立ちます。 –

0

はい、廃止予定です。
新しいFusedLocationProviderClientを使用しているときに必要ないくつかの点を以下に示します。

  1. は、私はあなたがLocationListenerインタフェースを実装していることがわかり輸入com.google.android.gms.location.FusedLocationProviderClient;
  2. としてそれをインポートします。 mFusedLocationClient.requestLocationUpdates()メソッドでは、LocationListenerをパラメータとして使用しません。 LocationCallbackを提供することができます。これは抽象クラスなので、LocationListenerのように実装することはできません。 Googleのguideに記載されているように、コールバックメソッドを作成し、 'this'の代わりに渡します。 import com.google.android.gms.location.LocationCallback;
  3. LocationCallbackを使用すると、onLocationChanged()の代わりにonLocationResult()になります。Locationオブジェクトの代わりにLocationResultオブジェクトを返します。 LocationResult.getLastLocation()を使用して、この結果オブジェクトで使用可能な最新の位置を取得します。 import com.google.android.gms.location.LocationResult;
0

私は11.2.0に固執しています。私は非難を理解していない。 11月/ 03/2017年の時点では、Googleのドキュメントは、これまでのところ、まだ参照するに:LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mListener);

3
// Better to use GoogleApiClient to show device location. I am using this way in my aap. 

    public class SuccessFragment extends Fragment{ 
     private TextView txtLatitude, txtLongitude, txtAddress; 
     private AddressResultReceiver mResultReceiver; 

     //Define fields for Google API Client 
     private FusedLocationProviderClient mFusedLocationClient; 
     private Location lastLocation; 
     private LocationRequest locationRequest; 
     private LocationCallback mLocationCallback; 

     private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 14; 

     @Nullable 
     @Override 
     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
      View view = inflater.inflate(R.layout.fragment_location, container, false); 

      txtLatitude = (TextView) view.findViewById(R.id.txtLatitude); 
      txtLongitude = (TextView) view.findViewById(R.id.txtLongitude); 
      txtAddress = (TextView) view.findViewById(R.id.txtAddress); 

      mResultReceiver = new AddressResultReceiver(null); 
      try { 
       mFusedLocationClient = LocationServices.getFusedLocationProviderClient(getActivity()); 
       mFusedLocationClient.getLastLocation() 
         .addOnSuccessListener(getActivity(), 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 
            txtLatitude.setText(String.valueOf(location.getLatitude())); 
            txtLongitude.setText(String.valueOf(location.getLongitude())); 
            if (mResultReceiver != null) 
             txtAddress.setText(mResultReceiver.getAddress()); 
           } 
          } 
         }); 
       locationRequest = LocationRequest.create(); 
       locationRequest.setInterval(5000); 
       locationRequest.setFastestInterval(1000); 
       if (txtAddress.getText().toString().equals("")) 
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
       else 
        locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 

       mLocationCallback = new LocationCallback() { 
        @Override 
        public void onLocationResult(LocationResult locationResult) { 
         for (Location location : locationResult.getLocations()) { 
          // Update UI with location data 
          txtLatitude.setText(String.valueOf(location.getLatitude())); 
          txtLongitude.setText(String.valueOf(location.getLongitude())); 
         } 
        } 

        ; 
       }; 
      } catch (SecurityException ex) { 
       ex.printStackTrace(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return view; 
     } 

     @Override 
     public void onStart() { 
      super.onStart(); 

      if (!checkPermissions()) { 
       startLocationUpdates(); 
       requestPermissions(); 
      } else { 
       getLastLocation(); 
       startLocationUpdates(); 
      } 
     } 

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

     /** 
     * Return the current state of the permissions needed. 
     */ 
     private boolean checkPermissions() { 
      int permissionState = ActivityCompat.checkSelfPermission(getActivity(), 
        Manifest.permission.ACCESS_COARSE_LOCATION); 
      return permissionState == PackageManager.PERMISSION_GRANTED; 
     } 

     private void startLocationPermissionRequest() { 
      ActivityCompat.requestPermissions(getActivity(), 
        new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
        REQUEST_PERMISSIONS_REQUEST_CODE); 
     } 


     private void requestPermissions() { 
      boolean shouldProvideRationale = 
        ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), 
          Manifest.permission.ACCESS_COARSE_LOCATION); 

      // Provide an additional rationale to the user. This would happen if the user denied the 
      // request previously, but didn't check the "Don't ask again" checkbox. 
      if (shouldProvideRationale) { 
       Log.i(TAG, "Displaying permission rationale to provide additional context."); 

       showSnackbar(R.string.permission_rationale, android.R.string.ok, 
         new View.OnClickListener() { 
          @Override 
          public void onClick(View view) { 
           // Request permission 
           startLocationPermissionRequest(); 
          } 
         }); 

      } else { 
       Log.i(TAG, "Requesting permission"); 
       // Request permission. It's possible this can be auto answered if device policy 
       // sets the permission in a given state or the user denied the permission 
       // previously and checked "Never ask again". 
       startLocationPermissionRequest(); 
      } 
     } 

     /** 
     * Callback received when a permissions request has been completed. 
     */ 
     @Override 
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
               @NonNull int[] grantResults) { 
      Log.i(TAG, "onRequestPermissionResult"); 
      if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) { 
       if (grantResults.length <= 0) { 
        // If user interaction was interrupted, the permission request is cancelled and you 
        // receive empty arrays. 
        Log.i(TAG, "User interaction was cancelled."); 
       } else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        // Permission granted. 
        getLastLocation(); 
       } else { 
        // Permission denied. 

        // Notify the user via a SnackBar that they have rejected a core permission for the 
        // app, which makes the Activity useless. In a real app, core permissions would 
        // typically be best requested during a welcome-screen flow. 

        // Additionally, it is important to remember that a permission might have been 
        // rejected without asking the user for permission (device policy or "Never ask 
        // again" prompts). Therefore, a user interface affordance is typically implemented 
        // when permissions are denied. Otherwise, your app could appear unresponsive to 
        // touches or interactions which have required permissions. 
        showSnackbar(R.string.permission_denied_explanation, R.string.settings, 
          new View.OnClickListener() { 
           @Override 
           public void onClick(View view) { 
            // Build intent that displays the App settings screen. 
            Intent intent = new Intent(); 
            intent.setAction(
              Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
            Uri uri = Uri.fromParts("package", 
              BuildConfig.APPLICATION_ID, null); 
            intent.setData(uri); 
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
            startActivity(intent); 
           } 
          }); 
       } 
      } 
     } 


     /** 
     * Provides a simple way of getting a device's location and is well suited for 
     * applications that do not require a fine-grained location and that do not need location 
     * updates. Gets the best and most recent location currently available, which may be null 
     * in rare cases when a location is not available. 
     * <p> 
     * Note: this method should be called after location permission has been granted. 
     */ 
     @SuppressWarnings("MissingPermission") 
     private void getLastLocation() { 
      mFusedLocationClient.getLastLocation() 
        .addOnCompleteListener(getActivity(), new OnCompleteListener<Location>() { 
         @Override 
         public void onComplete(@NonNull Task<Location> task) { 
          if (task.isSuccessful() && task.getResult() != null) { 
           lastLocation = task.getResult(); 

           txtLatitude.setText(String.valueOf(lastLocation.getLatitude())); 
           txtLongitude.setText(String.valueOf(lastLocation.getLongitude())); 

          } else { 
           Log.w(TAG, "getLastLocation:exception", task.getException()); 
           showSnackbar(getString(R.string.no_location_detected)); 
          } 
         } 
        }); 
     } 

     private void stopLocationUpdates() { 
      mFusedLocationClient.removeLocationUpdates(mLocationCallback); 
     } 

     private void startLocationUpdates() { 
      if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), 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; 
      } 
      mFusedLocationClient.requestLocationUpdates(locationRequest, mLocationCallback, null); 
     } 

     private void showSnackbar(final String text) { 
      if (canvasLayout != null) { 
       Snackbar.make(canvasLayout, text, Snackbar.LENGTH_LONG).show(); 
      } 
     } 


     private void showSnackbar(final int mainTextStringId, final int actionStringId, 
            View.OnClickListener listener) { 
      Snackbar.make(getActivity().findViewById(android.R.id.content), 
        getString(mainTextStringId), 
        Snackbar.LENGTH_INDEFINITE) 
        .setAction(getString(actionStringId), listener).show(); 
     } 
    } 


    // And our fragment_location.xml 

    <?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/locationLayout" 
      android:layout_below="@+id/txtAddress" 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/activity_margin_30dp" 
      android:orientation="horizontal"> 

      <TextView 
       android:id="@+id/txtLatitude" 
       android:layout_width="@dimen/activity_margin_0dp" 
       android:layout_height="@dimen/activity_margin_30dp" 
       android:layout_weight="0.5" 
       android:gravity="center" 
       android:hint="@string/latitude" 
       android:textAllCaps="false" 
       android:textColorHint="@color/colorPrimaryDark" 
       android:textColor="@color/colorPrimaryDark" /> 

      <TextView 
       android:id="@+id/txtLongitude" 
       android:layout_width="@dimen/activity_margin_0dp" 
       android:layout_height="@dimen/activity_margin_30dp" 
       android:layout_weight="0.5" 
       android:gravity="center" 
       android:hint="@string/longitude" 
       android:textAllCaps="false" 
       android:textColorHint="@color/colorPrimary" 
       android:textColor="@color/colorPrimary" /> 
     </LinearLayout> 
0

問題は、この>>輸入android.location.LocationListenerを削除し、あなたのimport文

です。

add >> import com.google.android.gms.location.LocationListener;