Android“onRequestPermissionsResult”未被调用

时间:2016-09-02 17:46:19

标签: java android maps

我正在尝试实现Marshmallow的权限支持,但我的代码“onRequestPermissionsResult”永远不会被调用。代码的“onCreate”和“onMapReady”部分工作正常。检查设备是否具有权限并请求权限正常。

我正在使用运行Android Marshmallow 6.0,API 23的Nexus 5X模拟器。

我试图做这里提到的 - > Android M Permissions: onRequestPermissionsResult() not being called

但我不能让它工作,如果我使用“ActivityCompat.requestPermissions”或直接“requestPermissions”并不重要,它就会被调用。

我还将我的appcompat和支持库更新到v24.2.0

有什么想法吗?

这是我的活动:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

private GoogleMap mMap;
UiSettings mapSettings;
int MY_LOCATION_REQUEST_CODE;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    // 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;

    //Check location permission for sdk >= 23
    if (Build.VERSION.SDK_INT >= 23) {

        if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            mMap.setMyLocationEnabled(true);
        } else {
            // Request permission.
            ActivityCompat.requestPermissions(MapsActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_LOCATION_REQUEST_CODE);
        }
    }

}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == MY_LOCATION_REQUEST_CODE) {
        if (permissions.length == 1 &&
                permissions[0] == android.Manifest.permission.ACCESS_FINE_LOCATION &&
                grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            mMap.setMyLocationEnabled(true);
        } else {
            // Permission was denied. Display an error message.
        }
    }
}

}

3 个答案:

答案 0 :(得分:1)

MY_LOCATION_REQUEST_CODE应该是非正常的常数。

您应该将其声明为

private static final int MY_LOCATION_REQUEST_CODE = 1;

答案 1 :(得分:0)

此行永远不会评估为true:

by

因为您是通过引用比较这两个字符串。

您应该使用data.table

permissions[0] == android.Manifest.permission.ACCESS_FINE_LOCATION

答案 2 :(得分:0)

我遇到了同样的问题,该问题仅在 API 23(Android M)上出现。 那是因为我在声明活动时在清单中使用了标志android:noHistory="true"

<activity   android:name=".view.activity.SplashScreenActivity"
            android:noHistory="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>

那是因为当显示权限对话框时,由于该标志,系统将完成活动。

将其删除或将其设置为false可以解决我的问题。