在 运行 时间请求权限,Android M+
Asking for permissions at run-time, Android M+
首先,我知道这是一个重复的问题,但我已经看完了其他类似问题的答案,并且无法找到任何这些解决方案的成功。
我开发了一个应用程序,它在我的测试设备上完美运行,它是三星 S4 运行ning Android L (5.0.1) 但是我希望这个应用程序也能运行在 Android.
的较新版本上
我知道 Android M+ 的请求权限已更改,因此必须在 运行 时询问它们,但是当我尝试执行此操作时,对话框从未出现,因此从未要求获得所需的权限。
我请求的权限是 ACCESS_FINE_LOCATION
。
这是我的清单文件中的相关代码:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
如果还没有 g运行ted:
if (ActivityCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
startGeofenceMonitoring();
} else {
askForPermission(android.Manifest.permission.ACCESS_FINE_LOCATION,LOCATION);
}
askForPermission 函数(根据 Google 的示例稍作修改):
private void askForPermission(String permission, Integer requestCode) {
if (ContextCompat.checkSelfPermission(MapsActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(MapsActivity.this, permission)) {
//This is called if user has denied the permission before
//In this case I am just asking the permission again
ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);
} else {
Log.d(TAG, "askForPermission: " + permission);
ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);
}
} else {
Toast.makeText(this, "" + permission + " is already granted.", Toast.LENGTH_SHORT).show();
}
}
以及 onRequestPermissionsResult 函数:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Log.d(TAG, "onRequestPermissionsResult: " + requestCode);
switch (requestCode) {
case 1:
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "onRequestPermissionsResult: request");
Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
startGeofenceMonitoring();
}
break;
}
}
正如我所说,请求权限的对话框从未出现,但我的控制台告诉我调用了 ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);
,经过大量研究后我仍然不确定为什么会这样不工作。我认为唯一可能的原因是这个 Activity 是一个显示 Google 地图的片段 activity。我确实尝试在另一个 activity 中请求权限,但发生了完全相同的事情。
谢谢。
编辑
所以我刚刚在一个全新的项目中测试了我在此处发布的代码,它 运行 很好并显示了对话框。我现在真的很困惑是什么阻止了这个对话框在我当前的项目中显示。
final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
private void requestPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) {
ActivityCompat
.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_ASK_PERMISSIONS);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_PERMISSIONS:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission Granted
Toast.makeText(MainActivity.this, "Permission Granted", Toast.LENGTH_SHORT)
.show();
} else {
// Permission Denied
Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT)
.show();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
我成功修复了!
在我的应用程序中,我使用了不同的 activity 来控制选项卡以及向用户显示哪个 activity。这是第一个显示的activity,我认为它是整个程序中唯一显示的activity,但只是显示其他活动的内容。因此,当我请求 MapsActivity 的权限时,它没有显示,因为 MapsActivity 不是实际存在的那个。
我的解释可能有误所以这是我的 TabBarActivity 的代码:
TabHost tabHost = getTabHost();
TabHost.TabSpec spec;
Intent intent;
intent = new Intent().setClass(this, SecondActivity.class);
spec = tabHost.newTabSpec("Second").setIndicator("Profile")
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, MapsActivity.class);
spec = tabHost.newTabSpec("First").setIndicator("Location")
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, ThirdActivity.class);
spec = tabHost.newTabSpec("Third").setIndicator("Settings")
.setContent(intent);
tabHost.addTab(spec);
下面的代码对我有用。
public static final int MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE=1;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.activity_tracks,container,false);
getPermission();
...
}
public void getPermission(){
if(ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){
if(ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.READ_EXTERNAL_STORAGE)){
}else{
ActivityCompat.requestPermissions(getActivity(),new String[] {Manifest.permission.READ_EXTERNAL_STORAGE},MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE);
}
}else{
getSongDetails();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case -1:
//hello
break;
case MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE:
if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
getPermission();
}else{
Toast.makeText(getActivity(),"You've denied permission",Toast.LENGTH_LONG).show();
}
return;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
首先,我知道这是一个重复的问题,但我已经看完了其他类似问题的答案,并且无法找到任何这些解决方案的成功。
我开发了一个应用程序,它在我的测试设备上完美运行,它是三星 S4 运行ning Android L (5.0.1) 但是我希望这个应用程序也能运行在 Android.
的较新版本上我知道 Android M+ 的请求权限已更改,因此必须在 运行 时询问它们,但是当我尝试执行此操作时,对话框从未出现,因此从未要求获得所需的权限。
我请求的权限是 ACCESS_FINE_LOCATION
。
这是我的清单文件中的相关代码:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
如果还没有 g运行ted:
if (ActivityCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
startGeofenceMonitoring();
} else {
askForPermission(android.Manifest.permission.ACCESS_FINE_LOCATION,LOCATION);
}
askForPermission 函数(根据 Google 的示例稍作修改):
private void askForPermission(String permission, Integer requestCode) {
if (ContextCompat.checkSelfPermission(MapsActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(MapsActivity.this, permission)) {
//This is called if user has denied the permission before
//In this case I am just asking the permission again
ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);
} else {
Log.d(TAG, "askForPermission: " + permission);
ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);
}
} else {
Toast.makeText(this, "" + permission + " is already granted.", Toast.LENGTH_SHORT).show();
}
}
以及 onRequestPermissionsResult 函数:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Log.d(TAG, "onRequestPermissionsResult: " + requestCode);
switch (requestCode) {
case 1:
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "onRequestPermissionsResult: request");
Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
startGeofenceMonitoring();
}
break;
}
}
正如我所说,请求权限的对话框从未出现,但我的控制台告诉我调用了 ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);
,经过大量研究后我仍然不确定为什么会这样不工作。我认为唯一可能的原因是这个 Activity 是一个显示 Google 地图的片段 activity。我确实尝试在另一个 activity 中请求权限,但发生了完全相同的事情。
谢谢。
编辑
所以我刚刚在一个全新的项目中测试了我在此处发布的代码,它 运行 很好并显示了对话框。我现在真的很困惑是什么阻止了这个对话框在我当前的项目中显示。
final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
private void requestPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) {
ActivityCompat
.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_ASK_PERMISSIONS);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_PERMISSIONS:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission Granted
Toast.makeText(MainActivity.this, "Permission Granted", Toast.LENGTH_SHORT)
.show();
} else {
// Permission Denied
Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT)
.show();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
我成功修复了!
在我的应用程序中,我使用了不同的 activity 来控制选项卡以及向用户显示哪个 activity。这是第一个显示的activity,我认为它是整个程序中唯一显示的activity,但只是显示其他活动的内容。因此,当我请求 MapsActivity 的权限时,它没有显示,因为 MapsActivity 不是实际存在的那个。
我的解释可能有误所以这是我的 TabBarActivity 的代码:
TabHost tabHost = getTabHost();
TabHost.TabSpec spec;
Intent intent;
intent = new Intent().setClass(this, SecondActivity.class);
spec = tabHost.newTabSpec("Second").setIndicator("Profile")
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, MapsActivity.class);
spec = tabHost.newTabSpec("First").setIndicator("Location")
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, ThirdActivity.class);
spec = tabHost.newTabSpec("Third").setIndicator("Settings")
.setContent(intent);
tabHost.addTab(spec);
下面的代码对我有用。
public static final int MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE=1;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.activity_tracks,container,false);
getPermission();
...
}
public void getPermission(){
if(ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){
if(ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.READ_EXTERNAL_STORAGE)){
}else{
ActivityCompat.requestPermissions(getActivity(),new String[] {Manifest.permission.READ_EXTERNAL_STORAGE},MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE);
}
}else{
getSongDetails();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case -1:
//hello
break;
case MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE:
if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
getPermission();
}else{
Toast.makeText(getActivity(),"You've denied permission",Toast.LENGTH_LONG).show();
}
return;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}