Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 请求相机权限会导致String.equals中出现NullPointerException_Java_Android - Fatal编程技术网

Java 请求相机权限会导致String.equals中出现NullPointerException

Java 请求相机权限会导致String.equals中出现NullPointerException,java,android,Java,Android,我正试图申请相机权限,以便在我的Android应用程序中使用谷歌OCR,但在大多数设备上,它在安装时崩溃 我读过类似的帖子,说这是由传递到ContextCompat.checkSelfPermission()的空上下文造成的,但我看不出上下文是如何为空的 这是我的密码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); set

我正试图申请相机权限,以便在我的Android应用程序中使用谷歌OCR,但在大多数设备上,它在安装时崩溃

我读过类似的帖子,说这是由传递到
ContextCompat.checkSelfPermission()
的空上下文造成的,但我看不出上下文是如何为空的

这是我的密码:

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

    StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
    StrictMode.setVmPolicy(builder.build());

    surfaceView = findViewById(R.id.surfaceView);

    if (checkForPermissions(Manifest.permission.CAMERA,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.INTERNET)) {
        surfaceView.getHolder().addCallback(new SurfaceCallback());
    }
}
...
private boolean checkForPermissions(String ... permissions) {
    List<String> permissionsToRequest = new ArrayList<>(Arrays.asList(permissions));

    for (Iterator<String> it = permissionsToRequest.iterator(); it.hasNext();) {
        if (ContextCompat.checkSelfPermission(this, it.next()) == PackageManager.PERMISSION_GRANTED) {
            it.remove();
        }
    }
    if (permissionsToRequest.isEmpty()) {
        return true;
    }

    ActivityCompat.requestPermissions(MainActivity.this, permissionsToRequest.toArray(permissions), 0);
    return false;
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String[] permissions,
                                       @NonNull int[] results) {
    if (requestCode != 0) {
        return;
    }

    for (int i = 0; i < results.length; i++) {
        if (results[i] != PackageManager.PERMISSION_GRANTED && permissions[i] != null) {
            AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
            alertDialog.setTitle("Permissions needed");
            alertDialog.setMessage("This app requires camera permissions to function properly.");
            alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "OK",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                            ActivityCompat.requestPermissions(MainActivity.this,
                                    new String[] {
                                        Manifest.permission.CAMERA,
                                        Manifest.permission.READ_EXTERNAL_STORAGE,
                                        Manifest.permission.INTERNET
                                    },
                                    0);
                        }
                    });
            alertDialog.show();
            return;
        }
    }
    surfaceView.getHolder().addCallback(new SurfaceCallback());
}

通过查看源代码,我的最佳猜测是您将
null
作为传递给
ActivityCompat.requestPermissions()
字符串[]
中的一个条目

这可能是由于您如何在数组和列表之间进行转换。特别是,
permissionsToRequest.toArray(permissions)
有点可怕,因为您试图重用作为参数传入的
字符串[]
。另外,
toArray()
将未使用的数组元素设置为
null

我会分配一个新的
字符串[]
,如下所示:

private boolean权限(字符串perm){
return(ContextCompat.checkSelfPermission(this,perm)==
包装经理许可(已授予);
}
私有字符串[]网络权限(需要字符串[]){
ArrayList结果=新建ArrayList();
用于(字符串烫发:需要){
如果(!hasPerm)){
结果:添加(perm);
}
}
return(result.toArray(新字符串[result.size()]);
}

您的问题在
computePermissionGrantState()
中,而您的问题的源代码中没有显示该问题。@Commonware请原谅我的无知,但我甚至不知道如何获取该代码。我的意思是,这是Android的代码,我不能从logcat上点击。对不起,我误读了堆栈跟踪,太多地关注类,而对包关注不够。让我浏览一下源代码,看看是否能找出可能的错误。有一件事你可以解决:从你的
checkForPermissions()
调用中删除
Manifest.permission.INTERNET
,因为这不是一个危险的权限。
checkForPermissions
中的
toArray
存在问题-请参阅列表文档:如果列表适合指定的数组,并且有空闲空间(即数组中的元素比列表中的元素多),那么紧跟在列表末尾的数组中的元素将设置为null。最有可能的情况是,您将原始列表至少修剪了1.@C.Swainston:理想情况下,
ActivityCompat.requestPermissions()
会对输入进行一些健全性检查,因此您会失败,并显示更好的错误消息。我对此表示感谢。很高兴听到你成功了!
4606/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.google.android.packageinstaller, PID: 4606
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
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:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at com.android.packageinstaller.permission.ui.GrantPermissionsActivity.computePermissionGrantState(GrantPermissionsActivity.java:314)
at com.android.packageinstaller.permission.ui.GrantPermissionsActivity.updateDefaultResults(GrantPermissionsActivity.java:363)
at com.android.packageinstaller.permission.ui.GrantPermissionsActivity.onCreate(GrantPermissionsActivity.java:122)
at android.app.Activity.performCreate(Activity.java:6662)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
at android.app.ActivityThread.-wrap12(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
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:866) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 
  private boolean hasPermission(String perm) {
    return(ContextCompat.checkSelfPermission(this, perm)==
      PackageManager.PERMISSION_GRANTED);
  }

  private String[] netPermissions(String[] wanted) {
    ArrayList<String> result=new ArrayList<String>();

    for (String perm : wanted) {
      if (!hasPermission(perm)) {
        result.add(perm);
      }
    }

    return(result.toArray(new String[result.size()]));
  }