[英]First start of App CameraSurface crashes. After submitting Permission it works
我有一個應用程序,該應用程序創建了一個附着有Camera的TextureView。 此刻,活動也是應用程序的主啟動器。 我想按預期使用新的權限樣式,並在應該使用Camera時將其稱為“權限”。 但是,當我第一次啟動該應用程序時,它會調用我的權限,我接受它,然后該應用程序崩潰( Logcat中的唯一信息是SIG:9 )。 當我再次啟動它(因為我已經提交)時,它可以正常工作。 我是否將呼叫權限設置在錯誤的位置? ( 順便說一句,我叫多個權限,因為我也開始創建一個圖片庫 )。 我找不到類似的問題,所以我現在想問這個問題。
這是我的代碼:
OnCreate:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
callPermissions(); // calls multiple Permissions.
setContentView(R.layout.camera_landscape);
mCaptureButton = (Button) this.findViewById(R.id.photoButton);
mCalcButton = (Button) this.findViewById(R.id.descriptor);
mTrackButton = (Button) this.findViewById(R.id.track);
mTextureView = (AutoTextureView) findViewById(R.id.texture);
}
callPermissions:
private void callPermissions(){
List<String> permissionsNeeded = new ArrayList<String>();
final List<String> permissionsList = new ArrayList<String>();
if(!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE))
permissionsNeeded.add("WRITE_EXTERNAL_STORAGE");
if(!addPermission(permissionsList, Manifest.permission.CAMERA))
permissionsNeeded.add("CAMERA");
if(permissionsList.size()> 0){
if(permissionsNeeded.size() > 0){
String message = "You need to grant access to " + permissionsNeeded.get(0);
for(int i = 1; i < permissionsNeeded.size(); i++)
message = message + ", " + permissionsNeeded.get(i);
showMessageOKCancel(message,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(CameraTest.this, permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ALL_PERMISSIONS);
}
});
return;
}
ActivityCompat.requestPermissions(CameraTest.this, permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ALL_PERMISSIONS);
}
}
和重寫onRequestPermissionResult:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
switch(requestCode){
case REQUEST_CAMERA_PERMISSION:
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
openCamera();
}else{
Toast.makeText(CameraTest.this, "CAMERA access Denied", Toast.LENGTH_SHORT).show();
}
break;
case REQUEST_CODE_ALL_PERMISSIONS:{
Map<String, Integer> perms = new HashMap<String, Integer>();
perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.CAMERA, PackageManager.PERMISSION_GRANTED);
for(int i = 0; i < permissions.length; i++)
perms.put(permissions[i], grantResults[i]);
if(perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
perms.get(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED){
}else{
//Permissions Denied
Toast.makeText(CameraTest.this, "Some Permission is Denied", Toast.LENGTH_SHORT).show();
}
}
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
這是LogCat的輸出:
10-25 10:56:56.906 26719-26719/? I/art: Late-enabling -Xcheck:jni
10-25 10:56:56.926 26719-26725/? I/art: Debugger is no longer active
10-25 10:56:57.084 26719-26743/? D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
10-25 10:56:57.163 26719-26743/? I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: QUALCOMM Build: 10/21/15, 369a2ea, I96aee987eb
10-25 10:56:57.172 26719-26743/? I/OpenGLRenderer: Initialized EGL, version 1.4
10-25 10:56:57.331 26719-26719/? I/CameraManagerGlobal: Connecting to camera service
10-25 10:57:02.407 26719-26719/com.example.camera D/AndroidRuntime: Shutting down VM
10-25 10:57:02.408 26719-26866/com.example.camera I/Process: Sending signal. PID: 26719 SIG: 9
好吧,我可以自己解決該解決方案,我還有一個方法(我完全openCamera
添加),稱為openCamera
它為TextureSurface配置了Camera:
private void openCamera() {
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
if(!ActivityCompat.shouldShowRequestPermissionRationale(CameraTest.this, Manifest.permission.CAMERA)){
//showMessageOKCancel("You need to allow access to Camera", new DialogInterface.OnClickListener(){
// @Override
// public void onClick(DialogInterface dialog, int which){
// ActivityCompat.requestPermissions(CameraTest.this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
// }
//});
return;
}
ActivityCompat.requestPermissions(CameraTest.this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
return;
}
cameraManager.openCamera(mCameraId, mDeviceCallback, mBackgroundHandler);
}catch(CameraAccessException e) {
e.printStackTrace();
}
}
當用戶尚未授予權限時,我還在那里啟動了一個對話框。 在對showMessageOkCancel方法(將創建對話框)進行注釋之后,一切正常,只有我的callPermissions
方法請求我的兩個權限,並且應用程序在第一次啟動時不會崩潰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.