Я просто пытаюсь создать простую приложение для камеры, которая использует разрешения во время выполнения ... кажется, что она загружается в первый раз, когда приложение (запрос на разрешение камеры). После разрешения доступа он работает ... но как только я закрою его и снова запустил, он просто показывает белое изображение с моими значками, которые не будут отвечать. Я проверил разрешения вручную в приложении, и камера по-прежнему получает доступ, но я думаю, что я надуваю свой код разрешений.Простое приложение для камеры (android) не загружает просмотр камеры после первой попытки
Вот код MainActivity:
public class MainActivity extends AppCompatActivity {
private static final int MY_PERMISSIONS_REQUEST_CAMERA = 1;
private Camera mCamera = null;
private Camera mCameraFront = null;
private CameraView mCameraView = null;
public int switchCamera = 1;
// int permissionCheck = ContextCompat.checkSelfPermission(this,
// Manifest.permission.CAMERA);
// String[] perms = {"android.permission.CAMERA"};
// int permsRequestCode = 200;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)) {
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CAMERA);
try {
mCamera = Camera.open(1);//you can use open(int) to use different cameras
} catch (Exception e) {
Log.d("ERROR", "Failed to get camera: " + e.getMessage());
}
SwapCamera();
// if (mCamera != null) {
//// mCameraView = new CameraView(this, mCamera);//create a SurfaceView to show camera data
//// FrameLayout camera_view = (FrameLayout)findViewById(R.id.camera_view);
//// camera_view.addView(mCameraView);//add the SurfaceView to the layout
// SwapCamera();
// }
//btn to close the application
ImageButton imgClose = (ImageButton) findViewById(R.id.imgClose);
imgClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mCamera.setPreviewCallback(null);
mCamera.setErrorCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
System.exit(0);
}
});
// btn to switch camera
ImageButton imgSwitch = (ImageButton) findViewById(R.id.cameraSwitch);
imgSwitch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// switchCamera++;
}
});
}
}
}
public void SwapCamera() {
mCameraView = new CameraView(this, mCamera);//create a SurfaceView to show camera data
FrameLayout camera_view = (FrameLayout)findViewById(R.id.camera_view);
camera_view.addView(mCameraView);//add the SurfaceView to the layout
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_CAMERA: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// camera-related task you need to do.
try{
mCamera = Camera.open(1);//you can use open(int) to use different cameras
} catch (Exception e){
Log.d("ERROR", "Failed to get camera: " + e.getMessage());
}
if(mCamera != null) {
// mCameraView = new CameraView(this, mCamera);//create a SurfaceView to show camera data
// FrameLayout camera_view = (FrameLayout)findViewById(R.id.camera_view);
// camera_view.addView(mCameraView);//add the SurfaceView to the layout
SwapCamera();
}
//btn to close the application
ImageButton imgClose = (ImageButton)findViewById(R.id.imgClose);
imgClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mCamera.setPreviewCallback(null);
mCamera.setErrorCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
System.exit(0);
}
});
// btn to switch camera
ImageButton imgSwitch = (ImageButton)findViewById(R.id.cameraSwitch);
imgSwitch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// switchCamera++;
}
});
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
public void onActivityResult() {
}
}
Я запутался, где я пропускаю «еще» ... У меня есть «попробовать» блок с помощью метода onRequestPermissionsResult ... Должен ли я переместить его в метод onCreate? (в пределах «if (ContextCompat.checkSelfPermission (это, Manifest.permission.CAMERA) ! = PackageManager.PERMISSION_GRANTED)" area) – fmi
Вы должны скопировать его в метод onCreate. - объяснил Виталий Матвиенко. – innich