2011-01-25 59 views
1

看過的書和提示,擺脫了所有的編譯錯誤和警告,並把一些調試語句攝像頭預覽:沒有錯誤,但沒有圖像:-(

package com.cit.BroadcastSim; 

import java.io.IOException; 

import android.app.Activity; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class BroadcastActivity extends Activity implements SurfaceHolder.Callback { 
    public Camera myCamera; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.broadcast); // Inflate the broadcast.xml file 

    Log.d("BROADCAST", "Creating the Activity"); 
    SurfaceView cameraSurface = (SurfaceView)findViewById(R.id.camerasurface); 
    SurfaceHolder cameraHolder = cameraSurface.getHolder(); 
    cameraHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    cameraHolder.addCallback(this); 
    Log.d("BROADCAST", "Now wait for some CallBacks"); 
} 


    public void surfaceCreated(SurfaceHolder holder) { 
    // Surface created, now it is possible to set the preview 
    Log.d("BROADCAST", "Surface Created"); 
    try { 
     Log.d("BROADCAST","CAMERA: NOT NULL"); 
     myCamera = Camera.open(); 
     myCamera.setPreviewDisplay(holder); 
     myCamera.startPreview(); 
     } catch (IOException e) { 
     Log.d("BROADCAST", e.getMessage()); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
    Log.d("BROADCAST", "Surface Destroyed"); 
    myCamera.stopPreview(); 
    myCamera.release(); 
    } 

    public void surfaceChanged(SurfaceHolder holder, int I, int J, int K) { 
    Log.d("BROADCAST", "Surface Changed"); 
    myCamera.stopPreview(); 
    myCamera.release(); 
    } 
} 

在DDMS調試器,我得到一個'創建活動'的日誌消息,後面跟着'現在等待一些CallBacks',就我的調試消息而言,沒有什麼更多的了,所以我認爲回調不起作用 - 因爲我的生活看不到它出錯的地方。

在清單我

的活動XML頁面有

<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/Broadcast" 
    /> 
<SurfaceView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/camerasurface" 
    /> 
</LinearLayout> 

最後,Android手機(HTC野火)上,頁面加載,顯示在左上角的TextView的消息,這是所有。

應該提及的是,我對這個平臺很陌生,並且認爲我可能錯過了非常基本的東西。

任何意見/建議,我將非常感激,

奧利弗

回答

0

沒有足夠的時間來解釋(在幾分鐘內與朋友會議)。我基本上添加了一些函數到「surfaceChanged()」(這是你應該開始預覽的地方)。

因此你不需要mCam.startPreview()在 「surfaceCreated()」

public void surfaceCreated(SurfaceHolder holder) { 
    // Surface created, now it is possible to set the preview 
    Log.d("BROADCAST", "Surface Created"); 
    try { 
     Log.d("BROADCAST","CAMERA: NOT NULL"); 
     mCam = Camera.open(); 
     mCam.setPreviewDisplay(holder); 
     //myCamera.startPreview(); 
     } catch (IOException e) { 
     Log.d("BROADCAST", e.getMessage()); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
    Log.d("BROADCAST", "Surface Destroyed"); 
    mCam.stopPreview(); 
    mCam.release(); 
    } 

    public void surfaceChanged(SurfaceHolder holder, int I, int J, int K) { 
     Camera.Parameters parameters = mCam.getParameters(); 
    List<Size> previewSizes = parameters.getSupportedPreviewSizes(); 
    Size bestSize = null; 
    int bestDiff = 0; 
    int diff = 0; 
    for (Size size : previewSizes) { 
      diff = Math.abs(K - size.height) + Math.abs(J - size.width); 
     if (bestSize == null || diff < bestDiff) { 
       bestSize = size; 
       bestDiff = diff; 
     } 
     parameters.setPreviewSize(bestSize.width, bestSize.height); 
     mCam.setParameters(parameters); 
    } 

    //start preview of camera 
     mCam.startPreview(); 
    } 

XML文件(你做了一個小副本&粘貼錯誤)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" 
    /> 

希望我可以幫助:) 我認爲,通過設置方向,您可以將相機圖片更改爲縱向模式。 :)(它現在是風景)

+1

嗨,已經設法解決我的問題的seom - 基本上關閉SurfaceChanged()中的所有東西,但你的泥土是非常漂亮的。今天晚上將花費在它上面,以確保我能夠正確理解它,然後再實施它。因爲它是人類交互實驗的一部分,所以請在縱向視圖中設置相機。非常感謝您的反饋,謝謝。 – LenseOnLife 2011-01-27 15:39:12

1

看看ApiDemos(Graphics-> CameraPreview)和類CameraPreview。這就是我所做的(所有的ApiDemos都很棒),它的功能就像一個魅力。先做好一件事情是件好事 - 然後你可以將它從你的應用中不需要的東西上剝離下來。演示也在線:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html。希望有所幫助。

+0

不能同意你的看法,有很多東西需要說明,不要在空白屏幕上查看,更糟糕的是,在源代碼中加載小紅X.快速瀏覽示例代碼,不知道我以前錯過了它 - 它非常全面,照顧的情況下,我永遠不會想到。非常感謝,我們需要更多的學習,並感謝大量的正確指導。奧利弗 – LenseOnLife 2011-01-27 15:45:47

0

說實話,我認爲整個相機預覽處理「手工」過於複雜。 如果您只是想拍攝照片並首先進行預覽,則可以通過Intent將此係統告知該系統。我寫了一個關於這個職位前一段時間http://javablogs.com/Jump.action?id=618025 基本上有云:

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, 1); 

然後你的活動中,你可以得到的數據在onActivityResult()回調

@Override 
public void onActivityResult(int requestCode, int resultCode,Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(requestCode==1&& resultCode==RESULT_OK) { 
    Bitmap bitmap = (Bitmap) data.getExtras().get("data"); 
    } 
} 

如果你需要一個更大的圖像比默認,看看MediaStore.EXTRA_OUTPUT