2016-12-11 79 views
8

Używam prostej do przodu Camera API, w celu zapewnienia kompatybilności wstecznej. Sama kamera jest nakładka nieznacznie przez ImageView i mój surfaceChanged robi to:Podgląd kamery w czerni w systemie Android 7

camera.setPreviewCallback((data, arg1) -> LiveView.this.invalidate()); 
camera.setPreviewDisplay(mHolder); 
camera.startPreview(); 

który działa dobrze na wszystkich starszymi urządzeniami. Ustawiłem rozmiar podglądu na największy dostępny rozmiar wcześniej w surfaceCreated. Jednak na Androidzie 7.1, jest nagle czarny (na Nexusie 6 i Moto X Play, prawdopodobnie inne - tak na różnych urządzeniach). Samo ustawienie SurfaceView jest wyszarzone w Layout Inspector (willNotDraw = true), ale VISIBLE (i przyspieszane sprzętowo). Co dziwne, nadal mogę robić zdjęcia, wydarzenie bez podglądu, a dane w oddzwanianiu podglądu zawierają obraz.

Jednocześnie pojawia się następujący Rej

E/mm-camera: mct_pipeline_send_ctrl_events: Send Set Parm events 
E/QCamera2HWI: static void* qcamera::QCameraCbNotifier::cbNotifyRoutine(void*) : cb message type 32768 not enabled! 
E/QCamera2HWI: static void* qcamera::QCameraCbNotifier::cbNotifyRoutine(void*) : cb message type 32768 not enabled! 
D/QCameraParameters: setSnapshotSkipHint: preview hint 3 fps 15.019738 

Czy ktokolwiek doświadczył całkowicie czarny obraz w Androidzie 7? Czy są jakieś łatwe poprawki? (Jak bezpośrednio rysunek treść danych?)

+0

Czy nie powinien używać Camera2 api dla Android wyższej wersji? –

Odpowiedz

3

Czarny ekran pojawia się, ponieważ nie masz pozwolenia na kamery android 7 urządzeniu

Goto Ustawienia-> apps-> wybrać swoje app-> permissions-> Włącz pozwolenie kamery i sprawdzić

można również obsługiwać ten wewnątrz kodu

Dodaj następujący pozwolenie na Twój manifest

<uses-permission android:name="android.permission.CAMERA" /> 

Aby poprosić o pozwolenie, możesz tak nazwać.

ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.CAMERA}, 
        MY_PERMISSIONS_REQUEST_CAMERA); 

Aby sprawdzić uprawnienia do dostępu do kamery

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

Teraz oddzwaniania jeśli użytkownik wykonał żadnych działań.

@Override 
public void onRequestPermissionsResult(int requestCode, 
            String permissions[], int[] grantResults) { 
switch (requestCode) { 
    case MY_PERMISSIONS_REQUEST_CAMERA: { 
     Log.i("Camera", "G : " + grantResults[0]); 
     // If request is cancelled, the result arrays are empty. 
     if (grantResults.length > 0 
       && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

      // permission was granted, yay! Do the 
      // contacts-related task you need to do. 

      openCamera(); 

     } else { 

      // permission denied, boo! Disable the 
      // functionality that depends on this permission. 

      if (ActivityCompat.shouldShowRequestPermissionRationale 
          (this, Manifest.permission.CAMERA)) { 

       showAlert(); 

      } else { 

      } 
     } 
     return; 
    } 

    // other 'case' lines to check for other 
    // permissions this app might request 

} 
} 

Oto kompletny przykład

import android.Manifest; 
    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.content.Context; 
    import android.content.DialogInterface; 
    import android.content.Intent; 
    import android.content.SharedPreferences; 
    import android.content.pm.PackageManager; 
    import android.net.Uri; 
    import android.os.Bundle; 
    import android.provider.Settings; 
    import android.support.v4.app.ActivityCompat; 
    import android.support.v4.content.ContextCompat; 
    import android.support.v7.app.AppCompatActivity; 
    import android.support.v7.widget.Toolbar; 

    public class MainActivity extends AppCompatActivity { 

public static final int MY_PERMISSIONS_REQUEST_CAMERA = 100; 
public static final String ALLOW_KEY = "ALLOWED"; 
public static final String CAMERA_PREF = "camera_pref"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

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

     if (getFromPref(this, ALLOW_KEY)) { 

      showSettingsAlert(); 

     } else if (ContextCompat.checkSelfPermission(this, 
       Manifest.permission.CAMERA) 
       != PackageManager.PERMISSION_GRANTED) { 
      // Should we show an explanation? 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
        Manifest.permission.CAMERA)) { 
       showAlert(); 
      } else { 
       // No explanation needed, we can request the permission. 
       ActivityCompat.requestPermissions(this, 
         new String[]{Manifest.permission.CAMERA}, 
         MY_PERMISSIONS_REQUEST_CAMERA); 
      } 
     } 
    } else { 
     openCamera(); 
    } 

} 

public static void saveToPreferences(Context context, String key, 
               Boolean allowed) { 
    SharedPreferences myPrefs = context.getSharedPreferences 
           (CAMERA_PREF, Context.MODE_PRIVATE); 
    SharedPreferences.Editor prefsEditor = myPrefs.edit(); 
    prefsEditor.putBoolean(key, allowed); 
    prefsEditor.commit(); 
} 

public static Boolean getFromPref(Context context, String key) { 
    SharedPreferences myPrefs = context.getSharedPreferences 
           (CAMERA_PREF, Context.MODE_PRIVATE); 
    return (myPrefs.getBoolean(key, false)); 
} 

private void showAlert() { 
    AlertDialog alertDialog = new AlertDialog.Builder(this).create(); 
    alertDialog.setTitle("Alert"); 
    alertDialog.setMessage("App needs to access the Camera."); 
    alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "DONT ALLOW", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
        finish(); 
       } 
      }); 
    alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "ALLOW", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
        ActivityCompat.requestPermissions(MainActivity.this, 
          new String[]{Manifest.permission.CAMERA}, 
          MY_PERMISSIONS_REQUEST_CAMERA); 

       } 
      }); 
    alertDialog.show(); 
} 

private void showSettingsAlert() { 
    AlertDialog alertDialog = new AlertDialog.Builder(this).create(); 
    alertDialog.setTitle("Alert"); 
    alertDialog.setMessage("App needs to access the Camera."); 
    alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "DONT ALLOW", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
        //finish(); 
       } 
      }); 
    alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "SETTINGS", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
        startInstalledAppDetailsActivity(MainActivity.this); 

       } 
      }); 
    alertDialog.show(); 
} 


@Override 
public void onRequestPermissionsResult 
       (int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_CAMERA: { 
      for (int i = 0, len = permissions.length; i < len; i++) { 
       String permission = permissions[i]; 
       if (grantResults[i] == PackageManager.PERMISSION_DENIED) { 
        boolean showRationale = 
         ActivityCompat.shouldShowRequestPermissionRationale 
                 (this, permission); 
        if (showRationale) { 
         showAlert(); 
        } else if (!showRationale) { 
         // user denied flagging NEVER ASK AGAIN 
         // you can either enable some fall back, 
         // disable features of your app 
         // or open another dialog explaining 
         // again the permission and directing to 
         // the app setting 
         saveToPreferences(MainActivity.this, ALLOW_KEY, true); 
        } 
       } 
      } 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 

    } 
} 

public static void startInstalledAppDetailsActivity(final Activity context) { 
    if (context == null) { 
     return; 
    } 
    final Intent i = new Intent(); 
    i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
    i.addCategory(Intent.CATEGORY_DEFAULT); 
    i.setData(Uri.parse("package:" + context.getPackageName())); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
    i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
    context.startActivity(i); 
} 

private void openCamera() { 
    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
    startActivity(intent); 
} 

} 
+0

To działa na systemie Android 6 i proszę o pozwolenie ... To takie dziwne. Zbadam później. – domenukk

0

Jak @apk powiedział wcześniej, czarny ekran pojawia się, ponieważ nie masz uprawnień do przenoszenia w kodzie. Jeśli pracujesz z targetSdkVersion 23 (i nowszym) będziesz musiał żądać uprawnień od użytkownika w czasie wykonywania.

Poprzedni komentarz wyjaśnia, w jaki sposób go rozwiązać poprzez operacje SDK bezpośrednio, ale wolę używać wielką bibliotekę stron trzecich dla tych przypadkach: Karumi/Dexter