代码之家  ›  专栏  ›  技术社区  ›  bhavikshah28

从片段中替换片段时,onRequestPermissionsResult回调不工作

  •  0
  • bhavikshah28  · 技术社区  · 7 年前

    我有一个活动,它有onRequestPermissionsResult,每当我在运行时请求权限时都会调用它,但当我从另一个片段中替换片段时,它不会被调用。

    我有3个碎片 片段A、B和C。 未连接到活动的片段

    主要活动代码:

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        List<Fragment> fragments = getSupportFragmentManager().getFragments();
        if (fragments != null) {
            for (Fragment fragment : fragments) {
    
                    fragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
            }
        }
    }
    

    片段B代码

    Fragment fragment = new ShedDetailFragment();
            Bundle args=new Bundle();
            args.putString("flockno",flockno);
            args.putString("shedno",shedno.get(position));
            fragment.setArguments(args);
            // Insert the fragment by replacing any existing fragment
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .add(fragment,"ShedDetailsFrament")
                    .replace(R.id.frame_container, fragment)
                    .commit();
    

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    
        switch (requestCode) {
            case 12:{
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                    takePhotoFromCamera();
                    //Toast.makeText(getActivity(),"Permission Granted for Camera.Please Select Farm Photo",Toast.LENGTH_SHORT).show();
    
                } else {
    
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }
            case 11:{
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                    saveImage(bitmap);
                    //Toast.makeText(getActivity(),"Permission Granted for Storage.Please Select Farm Photo",Toast.LENGTH_SHORT).show();
    
                } else {
    
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }
            // other 'case' lines to check for other
            // permissions this app might request
        }
    }
    

    允许任何权限时的错误日志

    E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.artevet.artevet, PID: 32741
                  java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=12, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.artevet.artevet/com.artevet.artevet.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.Fragment.onRequestPermissionsResult(int, java.lang.String[], int[])' on a null object reference
                      at android.app.ActivityThread.deliverResults(ActivityThread.java:4998)
                      at android.app.ActivityThread.handleSendResult(ActivityThread.java:5041)
                      at android.app.ActivityThread.access$1600(ActivityThread.java:229)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1875)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:7325)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.Fragment.onRequestPermissionsResult(int, java.lang.String[], int[])' on a null object reference
                      at com.artevet.artevet.MainActivity.onRequestPermissionsResult(MainActivity.java:383)
                      at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7291)
                      at android.app.Activity.dispatchActivityResult(Activity.java:7169)
                      at android.app.ActivityThread.deliverResults(ActivityThread.java:4994)
                      at android.app.ActivityThread.handleSendResult(ActivityThread.java:5041) 
                      at android.app.ActivityThread.access$1600(ActivityThread.java:229) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1875) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:7325) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Fatih Santalu    7 年前

    requestPermissions() onRequestPermissionsResult 方法。例如,请参见 this