不幸的是,应用程序已停止,允许权限或在允许后拒绝它工作,但在开始时我弹出我的应用程序已停止



我正在尝试请求相机权限,但每当我运行我的项目时,我的应用程序首先停止弹出,然后它显示允许或拒绝选项,如果我单击不再显示选项,它不会让我按允许。如果我允许我的应用程序运行它存在,我必须再次打开应用程序。但是问题将消失,我的应用程序将在下次尝试中完美运行。这是日志猫

07-26 18:41:56.080 3003-3003/com.example.android.camerapermission E/Android运行时:致命 异常:主要 进程: com.example.android.camerapermission, PID: 3003 java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.example.android.camerapermission/com.example.android.camerapermission.MainActivity}: java.lang.RuntimeException: 无法连接到相机服务 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416( at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476( at android.app.ActivityThread.-wrap11(ActivityThread.java( at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344( at android.os.Handler.dispatchMessage(Handler.java:102( at android.os.Looper.loop(Looper.java:148( at android.app.ActivityThread.main(ActivityThread.java:5417( at java.lang.reflect.Method.invoke(Native Method( at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726( at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616( 原因:java.lang.运行时异常:无法连接到相机服务 在android.hardware.Camera。(摄像头.java:495( at android.hardware.Camera.open(Camera.java:356( at com.example.android.camerapermission.MainActivity.onCreate(MainActivity.java:52( at android.app.Activity.performCreate(Activity.java:6237( at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107( at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369( at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476( at android.app.ActivityThread.-wrap11(ActivityThread.java( at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344( at android.os.Handler.dispatchMessage(Handler.java:102( at android.os.Looper.loop(Looper.java:148( at android.app.ActivityThread.main(ActivityThread.java:5417( at java.lang.reflect.Method.invoke(Native Method( at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726( at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616(

这是我的主要活动.java

package com.example.android.camerapermission;
import android.Manifest;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.test.mock.MockPackageManager;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.Toast;
import com.nispok.snackbar.Snackbar;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CAMERA = 0;

ImageButton imageButton;
Camera camera;
Camera.Parameters parameters;
boolean isflash = false;
boolean isOn = false;

public static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageButton = (ImageButton) findViewById(R.id.imageButton);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[] {Manifest.permission.CAMERA}, 0);
}
}
if (getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH))
;
{
camera = Camera.open();
parameters = camera.getParameters();
isflash = true;
}

imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

if (isflash) {
if (!isOn) {
imageButton.setImageResource(R.drawable.on);
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
camera.startPreview();
isOn = true;
} else {
imageButton.setImageResource(R.drawable.off);
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.stopPreview();
isOn = false;
}

} else {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Error.....");
builder.setMessage("Flashlight is not available on this device...");
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
}
});

}
public void showCamera(View view) {
Log.i(TAG, "Show that camera button is clicked. Checking permission.");
/**
* Include camera permission and
* check if camera is available in phone or not
*/
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// Camera permission is not granted yet
requestCameraPermission();
} else {
//Camera is available, show the camera preview
Log.i(TAG, "CAMERA permission has granted, displaying camera preview");
showCameraPreview();
}
}
/**
* Request the Camera Permission again in the case of user mistakenly denied permission.
* Create a SnackBar that will prompt the user to grant the permission, otherwise it is requested direcly.
*/
private void requestCameraPermission() {
Log.i(TAG, " Camera permission is still not granted. Requesting permission.");
//Start (camera_permission_request)
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)) {
// show an additional request to the user if the permission was not granted earlier.

} else {
//Camera permission has not been granted yet. Request directly.
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA);
}
// END (camera_permission_request)
}

private void showCameraPreview() {
getSupportFragmentManager().beginTransaction()
.replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())
.commit();
}

/**
* Receiving permission after granted
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_CAMERA) {
//Begin request (permission_result)
//Recieved permission result for the camera permission.
Log.i(TAG, "Request for Camera permission is received. ");
//Check if the only required permission has been granted
if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//Camera permission is safely granted, now you can preview.
Log.i(TAG, "Camera permission has succesfully granted, preview is being displayed");

} else {
Log.i(TAG, "CAMERA permission is not granted.");
// Finish(permission_result)
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.stopPreview();
isflash = false;
if (camera != null) {
camera.release();
camera = null;
}
}
}

注意:相机权限已在清单.xml中设置。

您需要将相机打开呼叫括在尝试捕获中。

try {
c = Camera.open(); // attempt to get a Camera instance
}
catch (Exception e){
// Camera is not available (in use or does not exist)
}

来自 Android 开发者网站,

Caution: Always check for exceptions when using Camera.open(). Failing to check for exceptions if the camera is in use or does not exist will cause your application to be shut down by the system.

让我们分解一下,这是你的代码:

1.  if (getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH))
2.      ;
3.  {
camera = Camera.open();
parameters = camera.getParameters();
isflash = true;
}

这就是发生的事情。

1.  // If the system has a camera flash
2.  // Do nothing. The condition terminates here.
3.  // Open camera in any case.

要修复它,请删除第 2 行上的杂散分号,并在将来注意您的分号。

相关内容

最新更新