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

需要帮助,在AlertDialog中的getPackageName()处崩溃。建设者

  •  0
  • Sujay  · 技术社区  · 6 年前

    我正在尝试访问 showAlertForPermission 从…起 onRequestPermissionsResult 哪个在 文件活动。Java语言 但它给 nullpointerexception at线

     Uri uri = Uri.fromParts("package", getPackageName(), null);
    

    在连接活动中。java:

    public void showAlertForPermission (Context context){
            AlertDialog.Builder NeverPopUp =new AlertDialog.Builder(context);
            NeverPopUp.setMessage("To continue, allow \"iXm Uplink\" access to your device's audio files. Tap Settings > Permissions, and turn Storage on.")
                    .setPositiveButton("Settings", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //settings
                            Intent intent = new Intent();
                            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                            Uri uri = Uri.fromParts("package", getPackageName(), null);
                            intent.setData(uri);
                            startActivity(intent);
                        }
                    })
                    .setNegativeButton("Not Now", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //Exit
                        }
                    })
                    .show();
        }
    

    在FilesActivity中。java:

    @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            switch (requestCode) {
                case 1: {
                    if (grantResults.length > 0
                            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        Log.v("Storage: ","Storage permissions Granted");
                    } else {
                        if (ActivityCompat.shouldShowRequestPermissionRationale(FilesActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                            //Shows permission explanation using dialog window
                        } else {
                            connectedActivity.showAlertForPermission(FilesActivity.this);
    
                        }
                    }
                }
            }
        }
    

    错误 :

     E/AndroidRuntime: FATAL EXCEPTION: main        
                          java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
                              at android.content.ContextWrapper.getPackageName(ContextWrapper.java:132)
                              at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:157)
                              at android.os.Handler.dispatchMessage(Handler.java:102)
                              at android.os.Looper.loop(Looper.java:154)
                              at android.app.ActivityThread.main(ActivityThread.java:6077)
                              at java.lang.reflect.Method.invoke(Native Method)
                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
    

    经过一些搜索,我尝试:

    Intent Intent=新Intent(activity,FileActivity.class);

    错误确实存在,我做错了什么?

    3 回复  |  直到 6 年前
        1
  •  0
  •   ישו אוהב אותך Mahavir    6 年前

    这是因为你在打电话 showAlertForPermission 来自ConnectionActivity。但您尚未创建ConnectionActivity对象。它肯定会引发空指针异常,从而导致程序崩溃。

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1: {
              ...
              // This will throw error because you
              connectedActivity.showAlertForPermission(FilesActivity.this);
    
            }
        }
    }
    

    在我看来,您正在尝试创建一个可重用的方法来显示警报对话框。所以你可以公开 显示权限警报 像这样:

    public static void showAlertForPermission (Context context) {
      ...
    }
    

    然后您可以这样使用它:

     ConnectionActivity.showAlertForPermission(FilesActivity.this);
    
        2
  •  0
  •   Bawa    6 年前

    你可能想试试 context.getPackageName() 。。 context 是传递给该方法的变量。

        3
  •  0
  •   Mina Samir    4 年前

    我更喜欢使用

    BuildConfig.APPLICATION_ID
    

    但首先,确保您的应用程序Id是正确的。 因为有时它不引用您的应用程序id,它可能引用库id或其他内容。 如果是这样,只需再次清理并重建项目,并确保导入正确的BuildConfig文件,因为您可以导入项目中使用的库的BuildConfig文件