Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何正确处理访问位置的onPermissionResult?_Android_Android Permissions - Fatal编程技术网

Android 如何正确处理访问位置的onPermissionResult?

Android 如何正确处理访问位置的onPermissionResult?,android,android-permissions,Android,Android Permissions,我正在为谷歌定位服务写一个hello world程序。我已经把大部分东西都编码好了;以下是onConnected方法: public void onConnected(Bundle bundle) { // Construct the Location Request mLocationRequest = new LocationRequest(); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_A

我正在为谷歌定位服务写一个hello world程序。我已经把大部分东西都编码好了;以下是
onConnected
方法:

public void onConnected(Bundle bundle) {

    // Construct the Location Request
    mLocationRequest = new LocationRequest();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(30000);

    // Check if permission granted
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

        // If not, ask for it.
        // On Marshmallow, display permission request dialog
        ActivityCompat.requestPermissions(
                this,
                new String[] {Manifest.permission.ACCESS_FINE_LOCATION},
                LOCATION_REQUEST_NUMBER);
    } else {

        // If already granted, request for location updates
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
    }
}
但是当用户点击对话框上的Allow后,我有点困惑于该怎么做

据我所知,我应该这样做:

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){
    switch (requestCode) {
        case LOCATION_REQUEST_NUMBER: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission Granted
                // Great. Now what?

                // I tried the following, but it crashes
                // LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

                // I also tried the following, but it still does nothing.
                mGoogleApiClient.connect();
            } else {
                // Permission Denied.
            }
        }
    }
}
我尝试在授予的
权限上再次调用
requestLocationUpdates
,但出现以下情况:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=1, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.example.starleaf1.locationexercise/com.example.starleaf1.locationexercise.MainActivity}: java.lang.NullPointerException: Attempt to read from field 'int com.google.android.gms.location.LocationRequest.b' on a null object reference
添加了详细信息

我希望应用程序告诉
TextView
显示当前坐标。我是这样编码的:

@Override
public void onLocationChanged(Location location) {
    Log.i(LOG_TAG, "Location has changed.");
    output.setText(location.toString());
}
但是,当点击“允许”按钮时,应用程序只是坐在那里无所事事。必须重新启动应用程序才能使其正常工作。

请尝试以下代码

private void showPermissionDialog() {
    // Here, thisActivity is the current activity
    if (ContextCompat.checkSelfPermission(mActivity,
            Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(mActivity,
                Manifest.permission.ACCESS_FINE_LOCATION)) {

            // Show an expanation 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(mActivity,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST_FOR_LOCATION);

            // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            // app-defined int constant. The callback method gets the
            // result of the request.
        }
    } else {
        if (mGoogleApiClient != null)
            mGoogleApiClient.connect();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_FOR_LOCATION: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if (mGoogleApiClient != null)
                    mGoogleApiClient.connect();
                // 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
    }
}
然后使用这个变量

private static final int MY_PERMISSIONS_REQUEST_FOR_LOCATION = 1;
试试这个

声明:

 private static final int REQUEST_CODE_SOME_FEATURES_PERMISSIONS = 124;  
然后

if(android.os.Build.VERSION.SDK_INT>=23) {
                int hasLocationPermission = checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION);

            List<String> permissions = new ArrayList<String>();
            if (hasLocationPermission != PackageManager.PERMISSION_GRANTED) {
                permissions.add(android.Manifest.permission.ACCESS_FINE_LOCATION);
            }




            if (!permissions.isEmpty()) {
                requestPermissions(permissions.toArray(new String[permissions.size()]), REQUEST_CODE_SOME_FEATURES_PERMISSIONS);
            }

        }
if(android.os.Build.VERSION.SDK\u INT>=23){
int hasLocationPermission=checkSelfPermission(android.Manifest.permission.ACCESS\u FINE\u LOCATION);
列表权限=新建ArrayList();
if(hasLocationPermission!=已授予PackageManager.PERMISSION){
permissions.add(android.Manifest.permission.ACCESS\u FINE\u位置);
}
如果(!permissions.isEmpty()){
requestPermissions(permissions.toArray(新字符串[permissions.size()])、REQUEST\u CODE\u一些\u功能\u权限);
}
}

public void onRequestPermissionsResult(int-requestCode,String[]permissions,int[]grantResults){
开关(请求代码){
案例请求\u代码\u某些\u功能\u权限:{
for(int i=0;i
您需要两个权限

  ActivityCompat.requestPermissions(this,new String[] {Manifest.permission.ACCESS_FINE_LOCATION,
               Manifest.permission.ACCESS_COARSE_LOCATION},LOCATION_REQUEST_NUMBER);

@Override
public void onRequestPermissionsResult(int requestCode,
                                   String permissions[], int[] grantResults) {
switch (requestCode) {
    case LOCATION_REQUEST_NUMBER: {
        // If request is cancelled, the result arrays are empty.
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED 
                && grantResults[1] == PackageManager.PERMISSION_GRANTED) {

            if (mGoogleApiClient != null)
                mGoogleApiClient.connect();
            // 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
}
您应该在加载活动时检查这些权限,以便
授予权限后,可以初始化位置实例
当我们请求位置许可时,尝试使用此选项,
我们需要申请两个权限才能访问\u FINE\u位置和
进入课程地点。
私有静态最终int权限\请求\代码=1;
私有void checkPermission()
{     
if(android.os.Build.VERSION.SDK_INT>=23){
int result=ContextCompat.checkSelfPermission(YourClass.this、Manifest.permission.ACCESS\u FINE\u LOCATION);
列表权限=新建ArrayList();
如果(结果!=PackageManager.PERMISSION_已授予){
权限.add(Manifest.permission.ACCESS\u FINE\u位置);
权限.add(Manifest.permission.ACCESS\u\u位置);
}
如果(!permissions.isEmpty()){
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.M){
requestPermissions(permissions.toArray(新字符串[permissions.size()])、权限\请求\代码);
}
}
然后
@凌驾
public void onRequestPermissionsResult(int-requestCode,字符串权限[],int[]grantResults){
开关(请求代码){
案例权限\请求\代码:
for(int i=0;i
经过一段时间的实验,我终于让它开始工作了

请注意,虽然这个解决方案在我的实验中有效,但我不确定我所做的改变是否真的起作用

我所做的是将
onRequestPermissionResult
中的
mgoogleapclient.connect()
更改为
mgoogleapclient.connect()
。我还将其设置为
Override

下面是该方法的最终外观:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case LOCATION_REQUEST_NUMBER: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if(mGoogleApiClient != null) {
                    mGoogleApiClient.reconnect();
                }
            } else {
                Log.i(LOG_TAG, "Permission denied by user.");
            }
        }
    }

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

检查下面的答案下面的大多数答案都围绕着添加
mGoogleApi。连接
onRequestPermissionResult
。但是应用程序仍然不做任何事情。如果您的服务运行正常,那么将调用
onLocationChanged
。您是否尝试过我的答案中提到的两个权限。@SohailZahid不幸的是,
onRequestPermissionResult
仍然没有使用两个权限调用。正如您所说,我添加了
mgoogleapClient.connect()
,但在授予权限后,应用程序仍然没有执行任何操作。
  You should check these permission at time of loading your activity so 
  that after permission granting , location instance can be initialize

 Try to use this one as when we are requesting for permission for location,
  we need to request for two permission for ACCESS_FINE_LOCATION and 
  ACCESS_COURSE_LOCATION.

private static final int PERMISSION_REQUEST_CODE = 1;

    private void checkPermission()
    {     

    if(android.os.Build.VERSION.SDK_INT>=23) {
    int result = ContextCompat.checkSelfPermission(YourClass.this, Manifest.permission.ACCESS_FINE_LOCATION);
    List<String> permissions = new ArrayList<String>();

    if( result != PackageManager.PERMISSION_GRANTED ) {
        permissions.add( Manifest.permission.ACCESS_FINE_LOCATION );
        permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
    }

    if( !permissions.isEmpty() ) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions( permissions.toArray( new String[permissions.size()] ), PERMISSION_REQUEST_CODE );
        }
    }


and then 

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_CODE:

            for( int i = 0; i < permissions.length; i++ ) {
                if( grantResults[i] == PackageManager.PERMISSION_GRANTED ) {
                    Log.d( "Permissions", "Permission Granted: " + permissions[i] );
                 // Here you write your code once permission granted

                    } else if( grantResults[i] == PackageManager.PERMISSION_DENIED ) {
                    Log.d( "Permissions", "Permission Denied: " + permissions[i] );
                }
            }

            break;
        default: {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }

    }
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case LOCATION_REQUEST_NUMBER: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if(mGoogleApiClient != null) {
                    mGoogleApiClient.reconnect();
                }
            } else {
                Log.i(LOG_TAG, "Permission denied by user.");
            }
        }
    }

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}