2016-11-10 9 views
0

Я просто пытаюсь создать простую приложение для камеры, которая использует разрешения во время выполнения ... кажется, что она загружается в первый раз, когда приложение (запрос на разрешение камеры). После разрешения доступа он работает ... но как только я закрою его и снова запустил, он просто показывает белое изображение с моими значками, которые не будут отвечать. Я проверил разрешения вручную в приложении, и камера по-прежнему получает доступ, но я думаю, что я надуваю свой код разрешений.Простое приложение для камеры (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() { 

    } 


} 

ответ

1

Я считаю, что вам не хватает «еще»

if (ContextCompat.checkSelfPermission(this, 
       Manifest.permission.CAMERA) 
       != PackageManager.PERMISSION_GRANTED) { 
// your code 

} else { 
    // stuff with camera 
    try{ 
     mCamera = Camera.open(1); 
    } catch (Exception e){ 
    ... 
} 
+0

Я запутался, где я пропускаю «еще» ... У меня есть «попробовать» блок с помощью метода onRequestPermissionsResult ... Должен ли я переместить его в метод onCreate? (в пределах «if (ContextCompat.checkSelfPermission (это, Manifest.permission.CAMERA) ! = PackageManager.PERMISSION_GRANTED)" area) – fmi

+0

Вы должны скопировать его в метод onCreate. - объяснил Виталий Матвиенко. – innich

1

Вы только начинаете персонал камеры в onActivityResult, который вызывается только тогда, когда у вас нет разрешений и запросить их:

if (ContextCompat.checkSelfPermission(this, 
       Manifest.permission.CAMERA) 
       != PackageManager.PERMISSION_GRANTED) { 
    ... 
} 

if нуждается в else для случая, когда разрешение уже PERMISSION_GRANTED. Вы должны сделать здесь тот же персонал, который вы делаете в вашей onActivityResult:

else { 
    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 = 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++; 
          } 
         }); 
} 
+0

Я скопировал блок try в оператор else (только за пределами! = До PERMISSION_GRANTED), но я все равно получаю тот же результат ... Я думаю, что не понимаю ваш ответ – fmi

+0

@fmi, вы получаете какое-либо исключение ? –

+0

Nope .... в первый раз, когда я загружаю приложение, он запрашивает меня с запросом .... передняя камера смотрит затем с двумя значками вверху ... после закрытия приложения и повторного открытия, я не получить подсказку больше, и я просто вижу белый экран с двумя значками вверх, которые больше не будут реагировать на прикосновения – fmi