Предварительный просмотр камеры: нет ошибок, но нет изображения :-( - PullRequest
1 голос
/ 25 января 2011

Прочитал книги и подсказки, избавился от всех ошибок компиляции и предупреждений и добавил несколько отладочных операторов.

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» и ничего более в терминах моих сообщений отладки, поэтому я думаю, что Callback не работает - на всю жизнь не могу понять, где я понял это неправильно.

В манифесте у меня есть

Страница действий 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) страница загружается, в левом верхнем углу появляется сообщение textView, и это все.

Следует упомянуть, что я очень новичок в этой платформе и согласен с тем, что я мог упустить что-то очень простое.

Любые идеи / комментарии будут очень благодарны,

Оливер

Ответы [ 3 ]

1 голос
/ 26 января 2011

взгляните на ApiDemos (Graphics-> CameraPreview) и класс CameraPreview.Это было то, что я сделал (все ApiDemos великолепны), и это сработало как шарм.Хорошо, чтобы сначала что-то работало - потом вы можете избавиться от того, что вам не нужно в вашем приложении.Демоверсия также здесь: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html. Надеюсь, что помог.

0 голосов
/ 26 января 2011

Честно говоря, я думаю, что предварительный просмотр всей камеры "вручную" слишком сложен.Если вы просто хотите сделать снимок и сделать предварительный просмотр, вы можете сообщить об этом системе через 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 .

0 голосов
/ 26 января 2011

не хватает времени, чтобы объяснить (встреча с друзьями через несколько минут).Я в основном добавил некоторые функции в "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"
    />

Надеюсь, что смогу помочь :) Я думаю, что, установив ориентацию, вы можете изменить изображение с камеры на портретный режим.:) (сейчас пейзаж)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...