当前位置: 首页 > 知识库问答 >
问题:

在运行时请求权限,Android M

柯易安
2023-03-14

首先,我知道这是一个重复的问题,但我已经看过了其他类似问题的答案,没有找到成功的解决方案。

我已经开发了一款应用程序,可以在我的测试设备上完美运行,这是一款运行Android L(5.0.1)的三星S4。不过,我希望这款应用程序也能在较新版本的Android上运行。

我知道Android M的请求权限已更改,因此必须在运行时请求权限,但当我尝试实现此功能时,对话框从未出现,因此从未请求所需的权限。

我请求的权限是ACCESS\u FINE\u LOCATION

以下是我清单文件中的相关代码:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

如果尚未获得许可,我会请求许可:

if (ActivityCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

    startGeofenceMonitoring();

} else {
    askForPermission(android.Manifest.permission.ACCESS_FINE_LOCATION,LOCATION);
}

askForPermission函数(根据谷歌的示例稍作修改):

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();
    }
}

以及onRecestPermissionsResult函数:

@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.request权限(MapsActivity.this,new String[]{权限},请求代码);,经过大量的研究,我仍然不确定为什么它不起作用。我认为唯一可能的原因是这个活动是一个显示谷歌地图的片段活动。我确实试图在另一个活动中请求权限,但是发生了完全相同的事情。

谢谢

编辑

所以我刚刚在一个全新的项目中测试了我发布在这里的代码,它运行得很好,显示了对话框。我现在真的很困惑是什么阻止了这个对话框在我当前的项目中显示。

共有3个答案

安轶
2023-03-14

下面的代码为我工作。

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);
    }

}
贺季
2023-03-14

我设法修好了!

在我的应用程序中,我使用了不同的活动来控制选项卡以及向用户显示的活动。这是第一个展示的活动,我认为这是整个节目中唯一展示的活动,但只展示了其他活动的内容。所以当我请求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);
索瀚海
2023-03-14
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);
    }
}
 类似资料:
  • 我做错了什么?

  • 问题内容: 我正在测试我的应用,即使清单中已经定义了,它也会被强制关闭。我在某处已经读到,如果我在运行时请求权限,则不会强制关闭您的应用程序。我也已经阅读了这个android文档,用于请求运行时权限。 因此,我知道我们可以请求一个如下所示的权限,该权限在android文档中有所提及。 上面的代码具有获取结果的回调方法。 我的问题是要向用户确切请求权限?我们应该在应用启动时使用请求权限还是应该在需要

  • 问题内容: 我有用于调用操作的代码,并且我需要声明运行时权限的最佳方式IVE我尝试了许多代码,但我始终会出错 这是我的基本代码,任何有关使其具有运行时权限的建议,请先谢谢 } 问题答案: 在您的方法中尝试此代码 现在,调用创建一个单独的方法: 添加以下两种用于运行时权限检查的方法: 还要确保将其添加到清单中: 碎片 如果您在中尝试使用此代码 ,请更改 至 并且也改变 至

  • 假设您有这样一种方法: 在整个应用程序中,如果要将文件保存到外部存储,可以执行以下操作。。。 这是一个简化的示例,所以不要讨论我关于阻止UI、正确处理异常等的情况。如果您不喜欢文件保存,您可以想象一个或或其他任何东西。关键是它是一个需要权限的操作,它返回一些值,并且在整个应用程序中使用。 在Android中 但是在新的Marshmallow(API 23)运行时权限模型中,在您可以将文件保存到外部

  • 我一直在尝试实现运行时权限。下面是它的代码片段: RunTimePermissionsUtil。JAVA 在一个名为AddFileActivity的活动中,我在一个点击事件中实现了这个监听器,其代码如下: 所以,我所有的代码都会执行,它会进入onNeed权限()代码,其中,它会进入 但是,令人惊讶的是,在此之后,没有任何对话框要求获得摄像头的运行时权限,相反,对话框关闭并再次显示活动。 有没有人能

  • 我添加了使用权限,包括WRITE_EXTERNAL_STORAGE,android.permission.相机,READ_EXTERNAL_STORAGEAndroidManifest.xml. 当我在Nexus6(API 24)中运行我的应用程序时,它向我抛出了以下错误: java.io.IOException:权限被拒绝 这是我的代码: 如何在权限相机运行时打开之前使用它?