2015-08-11 13 views
6

Recentemente sto imparando Android Camera e OpenglES di grafika (Grazie fadden). È buono sulla maggior parte dei dispositivi, ma ho riscontrato errori in alcuni dispositivi, in particolare dispositivi MTK (come MT6580, MT8163 ...) .setPreviewTexture non riuscito nel dispositivo MTK

Ad esempio, quando "CameraCaptureActivity" viene eseguito in MTK. Sto ottenendo questo errore:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.Camera.setPreviewTexture(android.graphics.SurfaceTexture)' on a null object reference

così ho cambiato funzione "handleSetSurfaceTexture" per questo:

private void handleSetSurfaceTexture(SurfaceTexture st) { 
    if(mCamera == null) 
    { 
     Log.e(TAG, "mCamera return null"); 
     return; 
    } 
    st.setOnFrameAvailableListener(this); 
    try { 
     mCamera.setPreviewTexture(st); 

    } catch (Exception ioe) { 
     Log.e(TAG, "camera failed handleSetSurfaceTexture"); 
     throw new RuntimeException(ioe); 
    } 
    mCamera.startPreview(); 
} 

quindi modificare l'errore a questo:

java.lang.RuntimeException: java.io.IOException: setPreviewTexture failed at jp.co.cyberagent.android.gpuimage.grafika.CameraCaptureActivity.handleSetSurfaceTexture(CameraCaptureActivity.java:1150)

Ho letto molte altre fonti di fotocamera app codice, credo che ci siano problemi sincroni con Camera e SurfaceRender nel dispositivo MTK. Così posso cambiare il codice come questo:

private void waitUntilSetup() 
{ 
    long l = System.currentTimeMillis(); 
    while ((getMaxTextureSize() == 0) && (System.currentTimeMillis() - l < 3000L)) 
    { 
     SystemClock.sleep(100L); 
    } 

    Log.e(TAG,"getMaxTextureSize() = " + getMaxTextureSize()); 
} 

private int getMaxTextureSize() { 
    int[] maxTextureSize = new int[1]; 
    GLES20.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0); 
    Log.e(TAG, "Max texture size = " + maxTextureSize[0]); 
    return maxTextureSize[0]; 
} 

private void handleSetSurfaceTexture(SurfaceTexture st) { 
    //wait for gl 
    waitUntilSetup(); 
    if(mCamera == null) 
    { 
     Log.e(TAG, "mCamera return null"); 
     return; 
    } 
    st.setOnFrameAvailableListener(this); 
    try { 
     mCamera.setPreviewTexture(st); 
    } catch (Exception ioe) { 
     Log.e(TAG, "camera failed handleSetSurfaceTexture"); 
     throw new RuntimeException(ioe); 
    } 
    mCamera.startPreview(); 
} 

Purtroppo, "getMaxTextureSize()" restituire un numero utile in altro dispositivo, ma ottengo solo getMaxTextureSize() = 0 in un dispositivo di MTK.

Così ho queste domande:

1) Come utilizzare surfaceRender/Camera/SurfaceTexture in modo sicuro?

2) Perché questo problema si verifica solo in MTK?

qualsiasi risposta sarà apprezzata.

aggiungo questo e prova di nuovo

//get glVersion 
    final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
    final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo(); 
    int nGLVersion = configurationInfo.reqGlEsVersion; 
    final boolean supportsEs2 = (nGLVersion >= 0x20000); 
    Log.e(TAG, "nGLVersion = " + nGLVersion + ", supportsEs2 = " + supportsEs2); 

in due del risultato dispositivo è:

nGLVersion = 131072, supportsEs2 = true

nGLVersion = 196608, supportsEs2 = true

ho anche ottenere informazioni del dispositivo:

 String strDevice = Devices.getDeviceName(); //https://gist.github.com/jaredrummler/16ed4f1c14189375131d 
    String strModel = Build.MODEL; 
    int nVersion = Build.VERSION.SDK_INT; 
    Log.e(TAG, "strDeviceName = " + strDevice + ", strModel =" + strModel + ", nVersion =" + nVersion); 

risultati:

strDevice = Alps k80_gmo, strModel =k80_gmo, nVersion =22

strDevice = Alps tb8163p3_64_sph, strModel =tb8163p3_64_sph, nVersion =22

A proposito, è ok alla prima apertura della macchina fotografica e della visualizzazione iniziale. Ma incontri "setPreviewTexture failed" quando l'attività fa una pausa o riapre la camera. Ottengo alcuni registri, quando fotocamera rilascio:

CameraClient native_window_api_disconnect failed: Broken pipe (-32)

quando riaprirà fotocamera:

CameraClient native_window_api_connect failed: No such device (-19)

Probabilmente ci sono problemi con questi dispositivi, ma anche testare qualche altra applicazione Fotocamera in questi dispositivi, e un po ' di loro si comporta bene. Quindi deve avere un modo migliore di usare Camera e glsurfaceview.

+0

Grafika ha una caratteristica che scarica le informazioni sulla versione GLES. Cosa mostra per il produttore e la versione? È un po 'strano che 'GL_MAX_TEXTURE_SIZE' stia arrivando a zero. – fadden

+0

Ho ricevuto questi errori nella piattaforma di test del cloud. è solo mostrare MTKXXXX. Migliorerò il mio caso di test e listerò il produttore il prima possibile. Grazie per la risposta, fadden –

+0

Sei sicuro che questi siano i veri dispositivi Android che hanno superato CTS? In caso contrario, è del tutto possibile che mancano funzionalità. – fadden

risposta

0

Ho ricevuto lo stesso problema su mCamera.setPreviewDisplay (titolare) risolto mettendo dichiarazione

camera.stopPreview(); 

prima

mCamera.setPreviewDisplay(holder) 
Problemi correlati