【问题标题】:Android PermissionsDispatch library returning null on location and not generating permisionsAndroid Permissions Dispatch 库在位置上返回 null 并且不生成权限
【发布时间】:2017-04-18 16:36:21
【问题描述】:

我厌倦了在 Android 中使用新的权限系统,因此开始寻找其他选项。 permissionsDispatch 库看起来很棒,但我无法让它工作。在过去的两个小时里,我一直在尝试让代码工作无济于事。这是一个相当小而简单的例子:

@RuntimePermissions
public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {

    private static final int MY_REQUEST_PERMISSION_COARSE_LOCATION = 45;
    public static final String TAG = "MAINACTIVITYITS";
    GoogleApiClient mGoogleApiClient;
    Location mLastLocation;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        GoogleApiBuilder();

    }

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

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

    @Override
    protected void onStop() {
        mGoogleApiClient.disconnect();
        super.onStop();
    }
    @SuppressWarnings("MissingPermission")
    @NeedsPermission(Manifest.permission.ACCESS_FINE_LOCATION)
    public void mLocationSetter(){
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        mLocationSetter();
        Log.i(TAG, mLastLocation.getLatitude() + "");
        Toast.makeText(this, mLastLocation.getLatitude() + "" , Toast.LENGTH_LONG).show();

    }

    @OnShowRationale(Manifest.permission.ACCESS_COARSE_LOCATION)
    public void locationRationale(PermissionRequest request){
        showRationaleDialog(R.string.permission_coarse_rationale, request);
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

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

    }

    @Override
    public void onLocationChanged(Location location) {

    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // NOTE: delegate the permission handling to generated method
        MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
    }

    private void showRationaleDialog(@StringRes int messageResId, final PermissionRequest request){
        new AlertDialog.Builder(this)
                .setPositiveButton(R.string.button_allow, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        request.proceed();
                    }
                })
                .setNegativeButton(R.string.button_deny, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        request.cancel();
                    }
                })
                .setCancelable(false)
                .setMessage(messageResId)
                .show();

    }
}

我的问题来自于 mLastLocation 实例变量,即使在使用 @NeedsPermission 标记进行注释后仍返回 null 并且根本没有显示基本原理。基本上,我要做的是通过相同的教程来获取 Google https://developer.android.com/training/location/retrieve-current.html 中的最后一个已知位置,但使用这个库而不是编写所有代码以获得权限。我错过了什么吗?我想要的只是最后一个已知位置。

【问题讨论】:

  • 您是否在清单中添加了这个<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />?
  • @rafsanahmad007 实际上,我还启用了注释处理器和所有功能。最后剩下的部分是查看代码出了什么问题。我在图书馆的主要 github 存储库中提交了一个问题(它已作为问题更改并关闭但没有结果)但它仍然无法正常工作
  • 有什么异常吗?是否显示了权限对话框?
  • @rafsanahmad007 权限对话框未显示,异常来自 mLastLocation 为 null,而 Log.i 部分显示 .getLatitude() 未显示,因为 mLastLocation 返回 null。

标签: java android android-permissions android-location


【解决方案1】:

尝试使用this库获取用户访问位置权限

【讨论】:

  • 听起来是个好主意。我仍然想让这个工作并知道它为什么不工作。
猜你喜欢
  • 2020-07-13
  • 2016-01-04
  • 2011-08-14
  • 2018-01-10
  • 2019-08-10
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多