Java Camera.open()为什么这行代码会使我的android应用程序崩溃?

Java Camera.open()为什么这行代码会使我的android应用程序崩溃?,java,android,camera,Java,Android,Camera,我不是一个有经验的程序员。我刚刚学习了一些基本的java,我正在考虑创建一个android应用程序。实际上是一个火炬应用。所以我按照youtube教程写了这段代码,但它不会在我的手机上打开。我有一部小米安卓oreo 8版手机 有人能回答我吗?提前谢谢 这句话让我的应用程序崩溃了 camera=camera.open() 它甚至没有在我的手机上打开,只是显示一个白色屏幕,然后应用程序关闭,但它在Android studio模拟器中运行良好 我的密码 SDK版本: android { compile

我不是一个有经验的程序员。我刚刚学习了一些基本的java,我正在考虑创建一个android应用程序。实际上是一个火炬应用。所以我按照youtube教程写了这段代码,但它不会在我的手机上打开。我有一部小米安卓oreo 8版手机

有人能回答我吗?提前谢谢

这句话让我的应用程序崩溃了
camera=camera.open()

它甚至没有在我的手机上打开,只是显示一个白色屏幕,然后应用程序关闭,但它在Android studio模拟器中运行良好

我的密码

SDK版本:

android {
compileSdkVersion 28

    minSdkVersion 16
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}
清单xml文件

<uses-permission android:name="android.permission.CAMERA"></uses-permission>
<uses-feature android:name="android.hardware.camera"></uses-feature>
<uses-permission android:name="android.permission.FLASHLIGHT"></uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

从您的
targetSDK
(28)和清单权限判断,我有一个强烈的预感,您没有使用
运行时权限

请将此添加到您的代码中(基本上是调用摄影机的运行时权限),以代替摄影机打开逻辑:

if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
    if (ActivityCompat.shouldShowRequestPermissionRationale((Activity)
            getContext(), Manifest.permission.CAMERA)) {
    } else {
        ActivityCompat.requestPermissions((Activity) getContext(), 
                new String[]{Manifest.permission.CAMERA},
                42);
   }
}
42
只是我选择的一个随机数,应该是权限请求代码

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

                camera = Camera.open();
                parameters = camera.getParameters();
                isFlash = true;
            } else {
                // failure logic
                }
            }
            break;
    }
}

onRequestPermissionsResult
是一个调用的函数,您应该在其中处理权限授予/拒绝逻辑

从您的
targetSDK
(28)和清单权限判断,我强烈预感到您没有使用
运行时权限

请将此添加到您的代码中(基本上是调用摄影机的运行时权限),以代替摄影机打开逻辑:

if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
    if (ActivityCompat.shouldShowRequestPermissionRationale((Activity)
            getContext(), Manifest.permission.CAMERA)) {
    } else {
        ActivityCompat.requestPermissions((Activity) getContext(), 
                new String[]{Manifest.permission.CAMERA},
                42);
   }
}
42
只是我选择的一个随机数,应该是权限请求代码

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

                camera = Camera.open();
                parameters = camera.getParameters();
                isFlash = true;
            } else {
                // failure logic
                }
            }
            break;
    }
}

onRequestPermissionsResult
是调用的函数,您应该在其中处理权限授予/拒绝逻辑

检查LogCat以了解崩溃的原因:。最有可能的情况是,您没有
摄影机
运行时权限。请检查LogCat以了解崩溃的原因:。很可能,您没有
CAMERA
运行时权限。