我正在尝试实现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.
}
}
}
}
答案 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
可以解决我的问题。