java - 安卓应用架构 : Implements user permission in lifecycle

标签 java android android-architecture-components android-architecture-lifecycle

我有一个扩展 LiveData 类的 LocationListener。从 Android 6.0 开始,在运行时请求权限。现在,当我尝试实现 LiveData 类时,它需要在 onActive() 函数中进行权限检查。 我必须在每个 Activity 中为请求的权限和收到的结果制作样板代码。有没有办法移动这样的 onRequestPermissionsResult()checkSelfPermission() 函数到 LocationListener ?

位置 fragment .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);
  }


}

最佳答案

when I tried to implements the LiveData Class and it required the permission checking in onActive() function

不,它没有。您看到的是一个 Lint 警告,您可以抑制它。 需要的是您在尝试使用 LiveData 的这一特定位之前持有权限。

Is there any way to move such onRequestPermissionsResult() and checkSelfPermission() functions to the LocationListener ?

没有。

关于java - 安卓应用架构 : Implements user permission in lifecycle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46108179/

相关文章:

java - 最好查询一次,然后根据返回的列值组织对象,还是使用不同的条件查询两次?

安卓机房 : LiveData callback of update insert?

android - 怎样才能让ActionBar上的item为左一中右一?

android - 将 Google Analytics "v4"集成到 Android 应用程序中

android - 如何一个接一个地合并两个实时数据?

android - 带有导航架构组件的 ViewPager

Java 反射 : how do the Method. getGenericXXXXX 方法有效吗?

java - Akka:如何关闭未终止的 Actor

java - Java中JVM如何加载父类

android - 在 Android 中静态创建 2X2 ImageView 的 GridView