2017-08-18 5 views
-2

Ich habe eine App erstellt, um die Augen mit Vision api zu verfolgen und es funktioniert gut, wenn das Telefon im Hochformat ist, aber wenn ich das Telefon in Querformat Position dann die App pausiert die Kamera und ging auf onMissing() -Methode.CameraSource (vision api) nicht erkennen, wenn das Telefon im Querformat ist

Bitte geben Sie mir einen Vorschlag machen, so dass die App in beiden Layouts arbeiten können, oder er kann die Augen von jedem Telefon Rotationen (0,90,180,270)

-Code erfassen:

private void createCameraResources() { 
    Context context = getApplicationContext(); 

    // create and setup the face detector 
    mFaceDetector = new FaceDetector.Builder(context) 
      .setProminentFaceOnly(true) 
      .setTrackingEnabled(true) 
      .setClassificationType(FaceDetector.ALL_CLASSIFICATIONS) 
      .setMode(FaceDetector.FAST_MODE) 
      .build(); 

    mFaceDetector.setProcessor(new LargestFaceFocusingProcessor(mFaceDetector, new FaceTracker())); 

    if (!mFaceDetector.isOperational()) { 
     Log.w(TAG, "createCameraResources: detector NOT operational"); 
    } else { 
     Log.d(TAG, "createCameraResources: detector operational"); 
    } 
    mCameraSource = new CameraSource.Builder(this, mFaceDetector) 
      .setRequestedPreviewSize(640, 480) 
      .setFacing(CameraSource.CAMERA_FACING_FRONT) 
      .setRequestedFps(30f) 
      .build(); 
} 



public class FaceTracker extends Tracker<Face> { 

private static final float PROB_THRESHOLD = 0.7f; 
private static final String TAG = FaceTracker.class.getSimpleName(); 
private boolean leftClosed; 
private boolean rightClosed; 

@Override 
public void onUpdate(Detector.Detections<Face> detections, Face face) { 
    if (leftClosed && face.getIsLeftEyeOpenProbability() > PROB_THRESHOLD) { 
     leftClosed = false; 
    } else if (!leftClosed && face.getIsLeftEyeOpenProbability() < PROB_THRESHOLD){ 
     leftClosed = true; 
    } 
    if (rightClosed && face.getIsRightEyeOpenProbability() > PROB_THRESHOLD) { 
     rightClosed = false; 
    } else if (!rightClosed && face.getIsRightEyeOpenProbability() < PROB_THRESHOLD) { 
     rightClosed = true; 
    } 

    if (leftClosed && !rightClosed) { 
     EventBus.getDefault().post(new LeftEyeClosedEvent()); 
    } else if (rightClosed && !leftClosed) { 
     EventBus.getDefault().post(new RightEyeClosedEvent()); 
    } else if (!leftClosed && !rightClosed) { 
     EventBus.getDefault().post(new NeutralFaceEvent()); 
    } 
} 

Manifest-Datei:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.android.eyetoggle"> 

<uses-permission android:name="android.permission.CAMERA" /> 
<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity 
     android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 

entsprechendes XML-Layout:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.percent.PercentFrameLayout  xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:padding="20dp" 
tools:context="com.android.eyetoggle.MainActivity"> 

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:orientation="horizontal"> 

    <android.support.v7.widget.SwitchCompat 
     android:id="@+id/switchButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:id="@+id/emoticon" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/emoji_neutral" /> 
</LinearLayout> 


<View 
    android:id="@+id/light" 
    android:layout_gravity="center" 
    android:background="@color/green" 
    app:layout_aspectRatio="100%" 
    app:layout_widthPercent="75%" /> 

</android.support.percent.PercentFrameLayout> 
+0

Lust auf google für 'android orientation'? –

+0

Ich habe bereits für dieses Problem gegoogelt, konnte aber nichts finden. Für hardware.Camera api gibt es eine Möglichkeit, die Ausrichtung der Anzeige einzustellen. – Puneet

+0

Es ist Android Grundlagen ... –

Antwort

0

Sie müssen sich für eine Orientierungsänderung zu überprüfen und wie, etwas zu tun

private void startIfReady() throws IOException { 
    if (mStartRequested && mSurfaceAvailable) { 
     mCameraSource.start(mSurfaceView.getHolder()); 
     if (mOverlay != null) { 
      Size size = mCameraSource.getPreviewSize(); 
      int min = Math.min(size.getWidth(), size.getHeight()); 
      int max = Math.max(size.getWidth(), size.getHeight()); 
      if (isPortraitMode()) { 
       // Swap width and height sizes when in portrait, since it will be rotated by 
       // 90 degrees 
       mOverlay.setCameraInfo(min, max, mCameraSource.getCameraFacing()); 
      } else { 
       mOverlay.setCameraInfo(max, min, mCameraSource.getCameraFacing()); 
      } 
      mOverlay.clear(); 
     } 
     mStartRequested = false; 
    } 
} 

@Override 
protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    int width = 320; 
    int height = 240; 
    if (mCameraSource != null) { 
     Size size = mCameraSource.getPreviewSize(); 
     if (size != null) { 
      width = size.getWidth(); 
      height = size.getHeight(); 
     } 
    } 

    // Swap width and height sizes when in portrait, since it will be rotated 90 degrees 
    if (isPortraitMode()) { 
     int tmp = width; 
     width = height; 
     height = tmp; 
    } 

private boolean isPortraitMode() { 
    int orientation = mContext.getResources().getConfiguration().orientation; 
    if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     return false; 
    } 
    if (orientation == Configuration.ORIENTATION_PORTRAIT) { 
     return true; 
    } 

    Log.d(TAG, "isPortraitMode returning false by default"); 
    return false; 
} 

Dies ist aus dem offiziellen Android Vision-github page.

+0

Dank @Shanky .. wird diesen Code/Link überprüfen und aktualisieren Sie die Ergebnisse hier – Puneet

+0

wie oben Code müssen wir die Kamera Vorschau zeigen und dann nur wird es für Flächenhalter arbeiten. Aber in meinem Fall ist die Kameravorschau falsch, die Kamera läuft im Hintergrund und durch Serviceaktivitäten läuft sie kontinuierlich, daher gibt es in meinem Code keinen surfaceView Halter. – Puneet

Verwandte Themen