2016-11-10 1 views
0

Ich versuche nur, eine einfache Kamera-App, die Laufzeitberechtigungen verwendet ... scheint es gut zu laden, das erste Mal, wenn die App ist gestartet (fragt nach der Kamera Erlaubnis). Nachdem ich den Zugriff zugelassen habe, funktioniert es ... aber sobald ich es schließe und es wieder starte, wird nur ein weißes Bild mit meinen Symbolen angezeigt, die nicht reagieren. Ich habe die Berechtigungen manuell in der App überprüft und der Kamera wird immer noch Zugriff gewährt, aber ich denke, dass ich meinen Berechtigungscode vermassle. HierMeine einfache Kamera-App (Android) wird die Kamera nicht nach dem ersten Versuch laden

ist der MainActivity Code:

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() { 

    } 


} 

Antwort

1

Ich glaube, Sie vermissen "else"

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

ich verwirrt bin, wo ich die „else“ bin fehle ... Ich habe meinen „versuchen“ Block mit der onRequestPermissionsResult Methode ... Soll ich es in die onCreate-Methode verschieben? (innerhalb des Bereichs "if (ContextCompat.checkSelfPermission (this, Manifest.permission.CAMERA) ! = PackageManager.PERMISSION_GRANTED)" – fmi

+0

Sie sollten es in die onCreate-Methode kopieren. @Vlad Matvienko erklärte. – innich

1

Sie nur Kamera Mitarbeiter in onActivityResult starten, die nur aufgerufen, wenn Sie nicht haben Berechtigungen und fordern sie an:

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

diese if benötigt else für den Fall, dass eine Berechtigung bereits PERMISSION_GRANTED ist. Sie haben in Ihrem onActivityResult hier das gleiche Personal Sie tun, um zu tun:

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

Ich habe den try-Block in die else-Anweisung kopiert (knapp hinter! = Zu PERMISSION_GRANTED), aber ich bekomme immer noch das gleiche Ergebnis ... Ich glaube, ich verstehe deine Antwort falsch – fmi

+0

@fmi, bekommst du irgendeine Ausnahme ? –

+0

Nein .... das erste mal lade ich die App, es fordert mich mit der Anfrage auf .... die Frontkamera zeigt dann mit den 2 Icons uptop .... nach dem Schließen der App und nochmaligem Öffnen, tue ich nicht bekomme ich eine Aufforderung und ich sehe nur einen weißen Bildschirm mit den 2 Symbolen oben, der nicht mehr auf Berührungen reagiert – fmi

Verwandte Themen