【问题标题】:Android requestPermission Dialog not showing upAndroid requestPermission 对话框未显示
【发布时间】:2017-08-08 18:52:09
【问题描述】:

我正在使用三星 Galaxy Tab S 平板电脑,并尝试在运行时授予在外部存储上写入的权限。

但是请求权限的对话框没有出现。相反,在代码中 onRequestPermissionResult 将立即执行,并带有 PERMISSION_DENIED 结果。我什至尝试在设备上的应用程序设置中手动授予存储权限,但即便如此,结果也会是 PERMISSION_DENIED(grantResults 为 -1)。

我的代码如下所示:

public class MainActivity extends AppCompatActivity {

    public static final int REQUEST_STORAGE_PERMISSION = 225;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (Build.VERSION.SDK_INT >= 23) {
            if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    == PackageManager.PERMISSION_GRANTED) {
                process();
            } else {
                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE_PERMISSION);
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case REQUEST_STORAGE_PERMISSION:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(getApplicationContext(), "Permission Granted", Toast.LENGTH_LONG).show();
                    process();

                } else {
                    Toast.makeText(getApplicationContext(), "Permission Denied", Toast.LENGTH_LONG).show();
                }
        }
    }


    public void process() {
        //...
    }

}

启动应用程序时,它会立即显示“Permission Denied”-Toast,之前没有显示任何对话框。即使我在平板电脑的应用程序设置中手动授予存储权限,也会发生这种情况。

我的清单文件还包含在类似线程中建议的正确位置(应用程序标签之外)的权限。

我尝试重新安装应用程序,甚至已经重置了平板电脑,但似乎没有任何效果。

【问题讨论】:

    标签: android android-6.0-marshmallow android-permissions


    【解决方案1】:

    代替:

     requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE_PERMISSION); 
    

    它适用于片段

    你需要使用这个:正如你使用AppCompatActivity

    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE_PERMISSION);
    

    编辑

    由于您有多个项目模块:您需要在这两个Manifest中添加权限

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

    【讨论】:

    • 非常感谢。所以我在我的主要项目中改变了这条线,没有任何改变。然后我继续,创建了一个新项目并复制了代码并且它工作了。所以我一直在寻找它在我的主要项目中不起作用的原因。该项目包含 2 个附加模块,当我在我的 gradle 文件中注释掉 compile project(':module1') 和 compile project(':module2') 行时,它突然起作用了。但是,当我重新评论它们时,请求对话框将不再显示。
    • 看看这个Answer
    • 好的,我现在确实修正了最后一个错误。问题是,只有我的主模块的清单文件包含必要的使用权限行。我不知道,所有模块也需要包含这一行。所以我将 添加到我所有模块的清单中,它现在可以工作了。非常感谢!
    • 可能是您在权限对话框中选中了复选框。
    【解决方案2】:

    做这件事

    private boolean RequestPermissions() {
    
    int camera = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.CAMERA);
    int storage = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
    List<String> listPermissionsNeeded = new ArrayList<>();
    if (camera != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(CAMERA);
    }
    if (storage != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(WRITE_EXTERNAL_STORAGE);
        listPermissionsNeeded.add(READ_EXTERNAL_STORAGE);
    
    }
    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(getActivity(), listPermissionsNeeded.toArray
                (new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
        return false;
    }
    
    return true;
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多