3

我有一个扩展 LiveData 类的 LocationListener。从 Android 6.0 开始,权限是在运行时请求的。现在,当我尝试实现 LiveData 类时,它需要权限检查onActive()功能。我必须在每个活动中为请求的权限和收到的结果制作样板代码。 有什么方法可以将此类 onRequestPermissionsResult()checkSelfPermission()功能移动到 LocationListener ?

LocationFragment.java

public class LocationFragment extends LifecycleFragment {

  private FragmentLocationBinding binding;


  public LocationFragment() {
    // Required empty public constructor
  }


  @Override
  public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if (ContextCompat.checkSelfPermission(getActivity(),
        permission.ACCESS_COARSE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {
      // Should we show an explanation?
      if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
          Manifest.permission.ACCESS_COARSE_LOCATION)) {
        // Show an explanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

      } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(getActivity(),
            new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
            200);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
      }
    }
    //get the viewmodel from activity
    LastLocationViewModel lastLocationViewModel = ViewModelProviders.of(getActivity())
        .get(LastLocationViewModel.class);
    lastLocationViewModel.getLastKnowLocation().observe(this, location -> {
      binding.setLocation(location);
    });

  }

  @Override
  public void onRequestPermissionsResult(int requestCode,
      String permissions[], int[] grantResults) {
    switch (requestCode) {
      case 200: {
        // If request is cancelled, the result arrays are empty.
        if (grantResults.length > 0
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
          Toast.makeText(getActivity(), "Rights Granted", Toast.LENGTH_SHORT).show();
          // permission was granted, yay! Do the
          // contacts-related task you need to do.
        } else {
          // permission denied, boo! Disable the
          // functionality that depends on this permission.
        }
        return;
      }

      // other 'case' lines to check for other
      // permissions this app might request
    }
  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    binding = DataBindingUtil
        .inflate(LayoutInflater.from(getActivity()), R.layout.fragment_location, null, false);
    return binding.getRoot();
  }

}

LastLocationListener.java

public class LastLocationListener extends LiveData<Location> {

  private LocationManager locationManager;

  private Context context;

  private LocationListener listener = new LocationListener() {
    @Override
    public void onLocationChanged(Location location) {

      Log.d("Location Msg", location.toString());
      setValue(location);
    }

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) {

    }

    @Override
    public void onProviderEnabled(String s) {

    }

    @Override
    public void onProviderDisabled(String s) {

    }
  };

  public LastLocationListener(Context context) {
    this.context = context;
    locationManager = (LocationManager) context.getSystemService(
        Context.LOCATION_SERVICE);
  }

  @Override
  protected void onActive() {
    if (ActivityCompat.checkSelfPermission(context, permission.ACCESS_FINE_LOCATION)
        != PackageManager.PERMISSION_GRANTED
        && ActivityCompat.checkSelfPermission(context, 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.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, listener);
  }

  @Override
  protected void onInactive() {
    locationManager.removeUpdates(listener);
  }


}
4

1 回答 1

4

当我尝试实现 LiveData 类并且它需要在 onActive() 函数中进行权限检查时

不,不是的。你看到的是一个 Lint 警告,你可以抑制它。需要的您在尝试使用LiveData.

有没有办法将这样的 onRequestPermissionsResult() 和 checkSelfPermission() 函数移动到 LocationListener ?

不。

于 2017-09-08T11:20:04.900 回答