手电筒片段 Android Studio
Posted
技术标签:
【中文标题】手电筒片段 Android Studio【英文标题】:Flashlight Fragment Android Studio 【发布时间】:2020-01-12 12:17:12 【问题描述】:我已经为我的应用程序创建了一个手电筒片段,并且我已经实现了此代码并打开手电筒工作,但我无法将其关闭。
我试着用一个按钮打开和关闭灯,或者现在用两个按钮打开和关闭灯,但没有任何区别。
当我切换片段时,灯会熄灭。
我希望有人知道该怎么做。 谢谢
public class Flashlight extends Fragment implements SurfaceHolder.Callback
private View view;
Button button_On, button_Off;
private boolean lightIsOn = false;
Camera camera;
android.hardware.Camera.Parameters parameters;
@Override
public void onStart()
super.onStart();
SurfaceView preview = (SurfaceView) getView().findViewById(R.id.PREVIEW);
SurfaceHolder mHolder = preview.getHolder();
mHolder.addCallback(this);
@Override
public void onPause()
super.onPause();
turnOffLight();
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
final Bundle savedInstanceState)
view = inflater.inflate(R.layout.fragment_flashlight, container, false);
button_On = (Button) view.findViewById(R.id.button_On);
button_Off = (Button) view.findViewById(R.id.button_Off);
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED)
requestPermissions(new String[]Manifest.permission.CAMERA,, PackageManager.PERMISSION_GRANTED);
if (!getActivity().getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH))
Toast.makeText(getActivity(), "Device has no flashlight", Toast.LENGTH_SHORT).show();
button_On.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
turnOnLight();
);
button_Off.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
turnOffLight();
);
return view;
开/关灯:
private void turnOnLight()
if (!lightIsOn)
if (camera == null || parameters == null)
return;
parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
camera.startPreview();
lightIsOn = true;
private void turnOffLight()
if (lightIsOn)
if (camera == null || parameters == null)
return;
parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.stopPreview();
lightIsOn = false;
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
@Override
public void surfaceDestroyed(SurfaceHolder holder)
if (camera != null)
camera.stopPreview();
camera.setPreviewCallback(null);
camera.release();
camera = null;
@Override
public void surfaceCreated(SurfaceHolder holder)
if (camera == null)
camera = Camera.open();
parameters = camera.getParameters();
try
camera.setPreviewDisplay(holder);
catch (IOException e)
camera.release();
camera = null;
清单:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
XML:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".Flashlight">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_
android:layout_>
<SurfaceView
android:id="@+id/PREVIEW"
android:layout_
android:layout_
android:layout_marginBottom="730dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<Button
android:id="@+id/button_On"
android:layout_
android:layout_
android:text="on" />
<Button
android:id="@+id/button_Off"
android:layout_
android:layout_
android:text="off" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
【问题讨论】:
【参考方案1】:好的,更新清单文件中的权限如下:
<permission android:name="android.permission.FLASHLIGHT"
android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
android:protectionLevel="normal"
android:label="@string/permlab_flashlight"
android:description="@string/permdesc_flashlight" />
尝试使用以下代码关闭灯:
cam.stopPreview();
cam.release(); // Very Important line
【讨论】:
不,我希望在切换片段时关闭灯。问题是我无法通过关闭按钮将其关闭。 这是什么 android:description="@string/permdesc_flashlight"?我该如何实现? @P.Trenkle 你可以跳过这行。 可以接受这个 cam.release();有用!多谢!现在,当我打开而不是关闭并尝试再次打开它时,应用程序会关闭。你知道为什么吗? @P.Trenkle 在此处发布您的 logcat【参考方案2】:在哪一行?
private void turnOffLight()
if (lightIsOn)
if (camera == null || parameters == null)
return;
camera = Camera.open();
parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.stopPreview();
camera.release(); // Very Important line
lightIsOn = false;
button_OnOff.setText("On");
【讨论】:
@Muazzam abbas 我尝试了多种变体,最好的是灯打开而不是关闭,当我尝试再次打开它时,按钮文本发生变化,但灯不能正常切换以上是关于手电筒片段 Android Studio的主要内容,如果未能解决你的问题,请参考以下文章