Предварительный просмотр камеры: нет ошибок, но нет изображения:-(
Прочитал книги и подсказки, избавился от всех ошибок компиляции и предупреждений и добавил несколько отладочных операторов.
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 Wildfire) страница загружается, текстовое сообщение появляется в левом верхнем углу, и это все.
Должен отметить, что я очень новичок в этой платформе и согласен, что я мог упустить что-то очень простое.
Любые идеи / комментарии будут очень цениться,
Оливер
3 ответа
Не хватает времени, чтобы объяснить (встреча с друзьями через несколько минут). Я в основном добавил некоторые функции в "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"
/>
Надеюсь, что смогу помочь:) Я думаю, что, установив ориентацию, вы можете изменить изображение с камеры на портретный режим.:) (сейчас пейзаж)
Взгляните на ApiDemos (Graphics->CameraPreview) и класс CameraPreview. Это было то, что я сделал (все ApiDemos великолепны), и это сработало как шарм. Хорошо, если сначала что-то работает - вы можете убрать это из того, что вам не нужно в вашем приложении. Демо-версия также доступна здесь: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html. Надеюсь, что это помогло.
Честно говоря, я думаю, что предварительная обработка всей камеры "вручную" слишком сложна. Если вы просто хотите сделать снимок и сделать предварительный просмотр, вы можете сообщить об этом системе через 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.