Как переписать жестко запрограммированный интерфейс в макет XML? - PullRequest
1 голос
/ 18 января 2012

Может ли кто-нибудь помочь мне переписать жестко запрограммированный интерфейс в файл макета XML?

В настоящее время onCreate() выглядит так:

public class ViewfinderEE368 extends Activity {    
    private Preview mPreview;
    private DrawOnTop mDrawOnTop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Hide the window title.
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        // Create our Preview view and set it as the content of our activity.
        // Create our DrawOnTop view.
        mDrawOnTop = new DrawOnTop(this);
        mPreview = new Preview(this, mDrawOnTop);
        setContentView(mPreview);
        addContentView(mDrawOnTop, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    }
}

Когда я заменяю:

setContentView(mPreview);
addContentView(mDrawOnTop, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

с:

setContentView(R.layout.main);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(mPreview);

это приложение вылетает.

Функция предварительного просмотра, вызываемая на mPreview = new Preview(this, mDrawOnTop), выглядит следующим образом:

class Preview extends SurfaceView implements SurfaceHolder.Callback {
    SurfaceHolder mHolder;
    Camera mCamera;
    DrawOnTop mDrawOnTop;
    boolean mFinished;

    Preview(Context context, DrawOnTop drawOnTop) {
        super(context);

        mDrawOnTop = drawOnTop;
        mFinished = false;

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        mCamera = Camera.open();
        try {
           mCamera.setPreviewDisplay(holder);

           // Preview callback used whenever new viewfinder frame is available
           mCamera.setPreviewCallback(new PreviewCallback() {
              public void onPreviewFrame(byte[] data, Camera camera)
              {
                  if ( (mDrawOnTop == null) || mFinished )
                      return;

                  if (mDrawOnTop.mBitmap == null)
                  {
                      // Initialize the draw-on-top companion
                      Camera.Parameters params = camera.getParameters();
                      mDrawOnTop.mImageWidth = params.getPreviewSize().width;
                      mDrawOnTop.mImageHeight = params.getPreviewSize().height;
                      mDrawOnTop.mBitmap = Bitmap.createBitmap(mDrawOnTop.mImageWidth, 
                              mDrawOnTop.mImageHeight, Bitmap.Config.RGB_565);
                      mDrawOnTop.mRGBData = new int[mDrawOnTop.mImageWidth * mDrawOnTop.mImageHeight]; 
                      mDrawOnTop.mYUVData = new byte[data.length];                    
                  }

                  // Pass YUV data to draw-on-top companion
                  System.arraycopy(data, 0, mDrawOnTop.mYUVData, 0, data.length);
                  mDrawOnTop.invalidate();
              }
           });

           Camera.Parameters parameters = mCamera.getParameters();
           Log.v("TAG", "getPictureFormat: "+parameters.getPictureFormat());
           Log.v("TAG", "getPreviewFormat: "+parameters.getPreviewFormat());

           android.hardware.Camera.Size previewSize = parameters.getPreviewSize();
           Log.v("TAG", "getPreviewSize: H="+previewSize.height+" W="+previewSize.width);

           android.hardware.Camera.Size pictureSize = parameters.getPictureSize();
           Log.v("TAG", "getPictureSize: H="+pictureSize.height+" W="+pictureSize.width);

           android.hardware.Camera.Size JPEGThumbSize = parameters.getJpegThumbnailSize();
           Log.v("TAG", "getJpegThumbnailSize: H="+JPEGThumbSize.height +" W="+JPEGThumbSize.width);

        } 
        catch (IOException exception) {
            mCamera.release();
            mCamera = null;
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // Surface will be destroyed when we return, so stop the preview.
        // Because the CameraDevice object is not a shared resource, it's very
        // important to release it when the activity is paused.
        mFinished = true;
        mCamera.setPreviewCallback(null);
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // Now that the size is known, set up the camera parameters and begin
        // the preview.
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setPreviewSize(320, 240);
        parameters.setPreviewFrameRate(15);
        parameters.setSceneMode(Camera.Parameters.SCENE_MODE_AUTO);
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
        mCamera.setParameters(parameters);
        mCamera.startPreview();

    }

}

Я использую исходный код из: http://www.stanford.edu/class/ee368/Android/ViewfinderEE368/

Выход LogCat ниже:

01-17 20:09:43.865: D/AndroidRuntime(16033): Shutting down VM
01-17 20:09:43.885: W/dalvikvm(16033): threadid=1: thread exiting with uncaught exception (group=0x40015560)
01-17 20:09:43.885: E/AndroidRuntime(16033): FATAL EXCEPTION: main
01-17 20:09:43.885: E/AndroidRuntime(16033): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.viewfinderee368/com.example.viewfinderee368.ViewfinderEE368}: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
01-17 20:09:43.885: E/AndroidRuntime(16033):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
01-17 20:09:43.885: E/AndroidRuntime(16033):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
01-17 20:09:43.885: E/AndroidRuntime(16033):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
01-17 20:09:43.885: E/AndroidRuntime(16033):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
01-17 20:09:43.885: E/AndroidRuntime(16033):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-17 20:09:43.885: E/AndroidRuntime(16033):    at android.os.Looper.loop(Looper.java:130)
01-17 20:09:43.885: E/AndroidRuntime(16033):    at android.app.ActivityThread.main(ActivityThread.java:3683)
01-17 20:09:43.885: E/AndroidRuntime(16033):    at java.lang.reflect.Method.invokeNative(Native Method)
01-17 20:09:43.885: E/AndroidRuntime(16033):    at java.lang.reflect.Method.invoke(Method.java:507)
01-17 20:09:43.885: E/AndroidRuntime(16033):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-17 20:09:43.885: E/AndroidRuntime(16033):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-17 20:09:43.885: E/AndroidRuntime(16033):    at dalvik.system.NativeStart.main(Native Method)
01-17 20:09:43.885: E/AndroidRuntime(16033): Caused by: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
01-17 20:09:43.885: E/AndroidRuntime(16033):    at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:181)
01-17 20:09:43.885: E/AndroidRuntime(16033):    at android.app.Activity.requestWindowFeature(Activity.java:2729)
01-17 20:09:43.885: E/AndroidRuntime(16033):    at com.example.viewfinderee368.ViewfinderEE368.onCreate(ViewfinderEE368.java:55)
01-17 20:09:43.885: E/AndroidRuntime(16033):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-17 20:09:43.885: E/AndroidRuntime(16033):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
01-17 20:09:43.885: E/AndroidRuntime(16033):    ... 11 more

1 Ответ

0 голосов
/ 19 января 2012

Похоже, что ваша ошибка на самом деле вызвана

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

из вашего журнала. т.е.

Caused by: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
01-17 20:09:43.885: E/AndroidRuntime(16033):    at     com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:181)
01-17 20:09:43.885: E/AndroidRuntime(16033):    at android.app.Activity.requestWindowFeature(Activity.java:2729)

Попробуйте удалить этот код и заменить его на

android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"

в теге активности вашего манифеста

...