gpt4 book ai didi

java - 函数隔离相机的LED灯和java.lang.NullPointerException : Attempt to invoke virtual method 'void android. hardware.Camera$Parameters

转载 作者:行者123 更新时间:2023-11-30 01:41:54 25 4
gpt4 key购买 nike

在我为自己的教育目的而尝试制作的应用程序中,我很难控制相机旁边的 LED 灯。我尝试按照 http://www.mkyong.com/android/how-to-turn-onoff-camera-ledflashlight-in-android/ 中的方法进行操作,但我正在努力使功能更抽象和更通用,以增加可重用功能并使代码更具可读性。

在创建我的 Activity 时,我们首先使用 PackageManager 检查 LED 摄像头是否确实存在。然后我打开相机。 onClick 函数运行函数 changeScreen() 和 toggleLight()。在这里您可以看到使用抽象的明显优势,即 toggleLight() 使用其他地方设置的代码作为黑盒工作。我知道的 changeScreen 函数是正确的,在添加 toggleLight() 之前它工作正常。

由于代码应该是正确的,因为它取自示例,我相信我在变量范围方面有问题。

1) boolean isLighOn 需要在哪里声明,是在函数中还是在 Activity 中?

2)相机变量同样的问题

我还应该如何着手创建一个抽象函数 toggleLight()?我已经在该网站上查看过,但是很多帖子都会将您发送到上面提供的链接。此外,我相信这个问题的答案会帮助很多用户,并会提供可重用的代码。

到目前为止,这是我的代码,我已经发布了我再次遇到的错误。

package com.mycompany.myapplication;

import android.app.*;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.drawable.ColorDrawable;
import android.hardware.Camera;
import android.os.*;
import android.util.Log;
import android.view.*;
import android.widget.*;


public class MainActivity extends Activity {

public RelativeLayout container;
private boolean isLighOn = false;
private Camera camera;

@Override
protected void onStop() {
super.onStop();

if (camera != null) {
camera.release();
}
}

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

Context context = this;
PackageManager pm = context.getPackageManager();

// if device support camera?
if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
Log.e("err", "Device has no camera!");
return;
}

camera = Camera.open();

container = (RelativeLayout) findViewById(R.id.MainActivity);
container.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
changeScreen(v);
toggleLight();
}
});
}

public void changeScreen(View v) {
ColorDrawable cd = (ColorDrawable) this.container.getBackground();
TextView ON = (TextView) findViewById(R.id.ON);
TextView OFF = (TextView) findViewById(R.id.OFF);

if (cd != null && cd.getColor() == getResources().getColor(R.color.BLACK)) {
container.setBackgroundColor(getResources().getColor(R.color.WHITE));
OFF.setVisibility(View.INVISIBLE);
ON.setVisibility(View.VISIBLE);
} else {
container.setBackgroundColor(getResources().getColor(R.color.BLACK));
OFF.setVisibility(View.VISIBLE);
ON.setVisibility(View.INVISIBLE);
}
}

public void toggleLight(){
final Camera.Parameters p = camera.getParameters();

if (isLighOn) {

Log.i("info", "torch is turn off!");

p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(p);
camera.stopPreview();
isLighOn = false;

} else {

Log.i("info", "torch is turn on!");

p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);

camera.setParameters(p);
camera.startPreview();
isLighOn = true;
}
}


}

当我在我的 Android Studio 模拟器上加载应用程序时,我的屏幕“打开”。但是,当您单击屏幕时,应用程序会崩溃。这只是我在 IDE 中可以找到的错误消息。我不确定如何解释此错误消息。

enter image description here

为了回应下面的评论,我现在发布包含权限的代码。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mycompany.myapplication">

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

<application

android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

最佳答案

不要依赖模拟器来产生可靠的相机行为。始终在真实设备上验证相机相关代码!

关于java - 函数隔离相机的LED灯和java.lang.NullPointerException : Attempt to invoke virtual method 'void android. hardware.Camera$Parameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34385370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com