【问题标题】:Action not working on Permission Denied操作对 Permission Denied 不起作用
【发布时间】:2017-06-12 19:54:40
【问题描述】:

当我的片段膨胀时,它会打开一个dialog box 以获得权​​限WRITE_EXTERNAL_STORAGE,这是 android 6.0+ 中要求的。我已经按照每个教程进行操作,但是在授予或拒绝权限时我的任何操作都不会执行。 我希望应用程序关闭并在权限被拒绝时显示祝酒词,这意味着当应用程序重新打开时permission would be asked again

片段开始:

public class SecondFragment extends Fragment {

View myView;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    myView = inflater.inflate(R.layout.second_layout, container, false);
    configureImageButton();
    ((MainActivity) getActivity()).setActionBarTitle("App");

    if (ContextCompat.checkSelfPermission(getActivity(),
            Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        } else {
            ActivityCompat.requestPermissions(getActivity(),
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    1);
        }
    }

onRequestPermissionsResult:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
    switch (requestCode) {
        case 1:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Snackbar.make(myView, "Permission Granted.", Snackbar.LENGTH_LONG).show();
            } else if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_DENIED) {
                Toast.makeText(getActivity(), "Reopen app and allow permission.", Toast.LENGTH_LONG).show();
                getActivity().finish();
            }
    }
}

应用会授予/拒绝权限,但会忽略 toast 或小吃吧。 所有建议表示赞赏。谢谢!

【问题讨论】:

  • 问题出在ActivityCompat.requestPermissions。在您的情况下,onRequestPermissionsResult 将在 Activity 中而不是在 Fragment 中调用。当你使用fragment的requestPermissions函数时,它会调用fragment的onRequestPermissionsResult
  • @aborocz 您的解释很有意义,谢谢,我将代码移到了我的活动中,因为它在片段内部不起作用。现在它完美地工作了。谢谢。

标签: android android-fragments android-permissions


【解决方案1】:

片段内部有一些变化 请像下面这样尝试

 private void checkLocationPermission() {
    if (ContextCompat.checkSelfPermission(this.mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {


            //Prompt the user once explanation has been shown
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_CODE);


        } else {
            // No explanation needed, we can request the permission.
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_CODE);
        }
    }
}

MY_PERMISSIONS_REQUEST_CODE = 1 在你的情况下

【讨论】:

  • 我尝试插入上面的代码,但它需要 API 级别 23+,并且在我的应用程序中我正在使用(并希望继续使用)API 级别 19+,是否有解决方法?谢谢
  • 如果 api 19 则无需检查任何许可,因为应用程序许可从 23 api 开始
【解决方案2】:

(1) 如果您的应用已被授予,则您无法通过此代码看到权限对话框。

if (ContextCompat.checkSelfPermission(getActivity(),
        Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED)

因此,请转到设置 - 应用程序 - 您的应用程序 - 并禁用您已授予的权限,然后再次运行您的应用程序。

(2) 您的 onCreateView 是否正确返回 myView?在您的示例代码中,没有“return myView;”

【讨论】:

    【解决方案3】:
    public static final int RequestPermissionCodeStorage = 105; // Declare Global Variable    
    
         public boolean checkStoragePermission() {
    
                    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    
                        int result = ContextCompat.checkSelfPermission(this,
                                Manifest.permission.WRITE_EXTERNAL_STORAGE);
                        if (result == PackageManager.PERMISSION_GRANTED) {
                            return true;
                        } else {
                            ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, RequestPermissionCodeStorage);
                            return false;
                        }
                    } else {
                        return true;
                    }
                }
    
    
        @Override
            public void onRequestPermissionsResult(int requestCode,
                                                   String permissions[], int[] grantResults) {
                switch (requestCode) {
    
                    case RequestPermissionCodeStorage: {
    
                        if (grantResults.length > 0
                                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
                        } else {
                            Toast.makeText(this, "Allow Permission of Storage", Toast.LENGTH_LONG).show();
                            finish();
                        }
                        return;
                    }
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2021-08-09
      • 2021-07-25
      • 2022-08-06
      • 2023-03-12
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多