2013-02-15 18 views
11

Prima di tutto: il seguente errore si verifica su 2 diversi HTC Desires, uno con 2.3.3, uno con 4.0.4.takePicture ha esito negativo con errore relativo all'heap

ottengo i seguenti messaggi di errore quando si cerca di chiamare .takePicture:

E/MemoryHeapBase(104): error opening /dev/pmem_camera: No such file or directory 
E/QualcommCameraHardware(104): failed to construct master heap for pmem pool /dev/pmem_camera 
E/QualcommCameraHardware(104): initSnapshot X failed with pmem_camera, trying with pmem_adsp 

corrispondente PictureCallback non viene richiamato dopo questo errore.

Le uniche spiegazioni che ho trovato sono state a) startPreview non è stato chiamato; b) provare a scattare foto troppo velocemente (prima che fosse richiamata la richiamata dell'immagine); c) non impostazione gli usi corretti/permessi

faccio a) qui, in onResume() della mia FullscreenActivity:

//open the camera resource 
cam = Camera.open(); 

Camera.Parameters params = cam.getParameters(); 
//change Parameters 
params.setJpegQuality(100);//best quality 
params.setFlashMode(Parameters.FLASH_MODE_TORCH); 
//params.setZoom(2); 
List<Size> supportedPreviewSizes = cam.getParameters().getSupportedPreviewSizes(); 
params.setPreviewSize(supportedPreviewSizes.get(0).width, supportedPreviewSizes.get(0).height); 
cam.setParameters(params); 

SurfaceView sv = (SurfaceView)this.findViewById(R.id.surfaceView1); 
SurfaceHolder mHolder = sv.getHolder(); 
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
mHolder.setSizeFromLayout(); 
mHolder.addCallback(this); 

try { 
    cam.setPreviewDisplay(mHolder); 
} catch (IOException e) { 
    Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
} 

//Log.d(TAG, "Starting Preview"); 
cam.startPreview(); 

b) non dovrebbero applicarsi a me come io unico tentativo di prendere una singola immagine

c): usa-parte del mio manifesta:

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="8" /> 
<uses-permission android:name="android.permission.CAMERA"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.FLASHLIGHT"/> 
<uses-feature android:name="android.hardware.camera" /> 
<uses-feature android:name="android.hardware.camera.autofocus"/> 
<uses-feature android:name="android.hardware.camera.flash"/> 

Un altro codice:

Dove invoco takePicture (nota che la registrazione qui indica che un AsyncTask è autorizzato a richiamare di nuovo takePicture dopo che è stato completato. Irrilevante tuttavia, come l'errore persiste, senza mai chiamare l'AsyncTask):

findViewById(R.id.snap_button).setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 

     recording = !recording; 

     Button btn = (Button)findViewById(R.id.snap_button); 
     if(recording) { 
      //update buttontext 
      btn.setText("Stop"); 
      //start recording by taking a picture 
      cam.takePicture(null,null, mPicture); 

     } else { 
      //update button text 
      btn.setText("Start"); 
     } 

    } 
}); 

EDIT: Dopo un po 'alterare il mio layout della pictureCallback è finalmente invocato e ottengo dati validi (yay), tuttavia l'errore persiste. Ecco il mio layout corrente:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" > 

    <SurfaceView 
     android:id="@+id/surfaceView1" 
     android:layout_width="0dp" 
     android:layout_height="369dp" 
     android:layout_weight="1.55" /> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 

     <Button 
      android:id="@+id/snap_button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Capture" /> 

     <ProgressBar 
      android:id="@+id/progressBar1" 
      style="?android:attr/progressBarStyleLarge" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

    </LinearLayout> 

</LinearLayout> 
+1

Hai risolto il problema? –

+0

Avete installato la scheda SD quando questo codice viene eseguito? http://forum.xda-developers.com/showthread.php?t=819037#6 –

+0

Sto salvando le immagini che prendo sulla sdcard, quindi si presume che sia montato correttamente. Ho appena provato un-and remounting ma il messaggio di errore persiste. –

risposta

1

Direi che ci sono alcuni errori nei passaggi.

Si dovrebbe dare un'occhiata a questo esempio: cw-android - camera preview (riga 127+). Sto indovinando che non stai in attesa fino prima volta surfaceChanged nel SurfaceHolder.Callback, dove di solito si dovrebbe richiamare startPreview() metodo, così le spiegazioni

a) startPreview non è stato chiamato;

b) tentativo di scattare foto troppo velocemente (prima che fosse richiamata la richiamata dell'immagine);

sono, probabilmente, entrambi corretti.

+0

Questo è ciò che sto facendo attualmente e il messaggio persiste.Chiamare startPreview troppo presto causa un errore diverso, credo, –

+0

Puoi allegare il codice completo. Posso testare sul mio HTC Desire con Android 2.3.3, in modo da poter eliminare i problemi hardware o dei fornitori se il messaggio persiste :) – Tomo

Problemi correlati