2016-10-25 3 views
0

У меня есть приложение, которое создает TextureView с прикрепленной к нему камерой. В момент Moment Activity также является MainLauncher приложения. Я хотел использовать новый стиль разрешения так же, как предполагалось, и называл это Разрешение, когда камера должна использоваться. Но когда я запускаю приложение в первый раз, он вызывает мое разрешение, я принимаю его, и после этого приложение вылетает (Только информация в Logcat - это SIG: 9). Когда я снова начинаю (потому что я уже отправил), он работает нормально. Я установил требование о разрешении не в том месте? (btw. Я вызываю несколько разрешений, потому что я также начинаю создавать галерею изображений). Я не мог найти похожие вопросы, поэтому я хотел задать вопрос сейчас.Первый запуск приложения CameraSurface. После отправки разрешения это работает

Вот мой код:

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 

ответ

0

Ну я мог бы решить решение сам, У меня также есть метод (который я полностью пропустил добавить), которая называется openCamera который настраивает камеру для TextureSurface:

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 запрашивает мои два Разрешения, и приложение не падает при первом запуске.