簡體   English   中英

相機預覽凍結在菜單意圖上

[英]Camera Preview freezing on Menu Intent

我有一個Glass應用程序,在該應用程序中我試圖使用Live Card從菜單選項啟動“ Camera Preview”活動。 當我離開Live Card(例如轉到天氣)並返回,然后嘗試通過菜單選項調出相機時,該應用程序似乎凍結了。 對不起,所有代碼,以下是以下文件:

Service.java

. . .
   @Override
    public IBinder onBind(Intent intent) { return mBinder; }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        if (mLiveCard == null) {
            mLiveCard = new LiveCard(this, LIVE_CARD_TAG);

            mRemoteViews = new RemoteViews(getPackageName(), R.layout.service_layout);
            mLiveCard.setViews(mRemoteViews);

            // Display the options menu when the live card is tapped.
            Intent menuIntent = new Intent(this, MenuActivity.class);
            menuIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                    Intent.FLAG_ACTIVITY_CLEAR_TASK);

            mLiveCard.setAction(PendingIntent.getActivity(this, 0, menuIntent, 0));
            mLiveCard.attach(this);
            mLiveCard.publish(PublishMode.REVEAL);

        } else {
            mLiveCard.navigate();
        }
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        if (mLiveCard != null && mLiveCard.isPublished()) {
            mLiveCard.unpublish();
            mLiveCard = null;
        }
        super.onDestroy();
    }
}

MenuActivity.java

public class MenuActivity extends Activity {

    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        // Open the options menu right away.
        openOptionsMenu();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.layout, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.action_stop:
                // Stop the service which will unpublish the live card.
                stopService(new Intent(MenuActivity.this, Service.class));
                return true;

            case R.id.action_camera:
                startActivity(new Intent(MenuActivity.this, Camera.class));
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public void onOptionsMenuClosed(Menu menu) { finish(); }
}

Camera.java

public class Camera extends Activity {

    private SurfaceView mPreview = null;
    private SurfaceHolder mPreviewHolder = null;
    private Camera mCamera = null;
    private boolean inPreview = false;
    private boolean cameraConfigured = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera);


        mPreview = (SurfaceView) findViewById(R.id.camera_preview);
        mPreviewHolder = mPreview.getHolder();
        mPreviewHolder.addCallback(surfaceCallback);
    }


    @Override
    public void onResume() {
        super.onResume();

        mCamera = Camera.open();
        startPreview();
    }

    @Override
    public void onPause() {
        super.onPause();

        if (inPreview) {
            mCamera.stopPreview();
        }

        mCamera.release();
        mCamera = null;
        inPreview = false;
    }

    private Camera.Size getBestPreviewSize(int width, int height,
                                           Camera.Parameters parameters) {
        Camera.Size result = null;

        for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
            if (size.width <= width && size.height <= height) {
                if (result == null) {
                    result = size;
                } else {
                    int resultArea = result.width * result.height;
                    int newArea = size.width * size.height;

                    if (newArea > resultArea) {
                        result = size;
                    }
                }
            }
        }
        return (result);
    }

    private void initPreview(int width, int height) {
        if (mCamera != null && mPreviewHolder.getSurface() != null) {
            try {
                mCamera.setPreviewDisplay(mPreviewHolder);
            } catch (Throwable t) {
                Log.e("PreviewDemo-surfaceCallback",
                        "Exception in setPreviewDisplay()", t);
            }

            if (!cameraConfigured) {
                Camera.Parameters parameters = mCamera.getParameters();
                Camera.Size size = getBestPreviewSize(width, height,
                        parameters);

                if (size != null) {
                    parameters.setPreviewSize(size.width, size.height);
                    mCamera.setParameters(parameters);
                    cameraConfigured = true;
                }
            }
        }
    }

    private void startPreview() {
        if (cameraConfigured && mCamera != null) {
            mCamera.startPreview();
            inPreview = true;
        }
    }

我似乎無法弄清楚為什么相機預覽最初可以起作用,但導航時卻不起作用。 我覺得這里缺少一些簡單的東西。 任何幫助將不勝感激!

我不確定這是否可以解決您的問題,但是我會以此方式啟動和停止相機:

private Camera getCameraInstance() {
    Camera mCamera = null;
    try {
        /* attempt to get a Camera instance */
        mCamera = Camera.open();
    } catch (Exception e) {
        /* Camera is not available (in use or does not exist) */
        Log.e(TAG, "Error getting camera: " + e.getMessage());
        // process null error here
        // finish();
    }

    /* returns null if camera is unavailable */
    return mCamera;
}


@Override
public void onResume() {
    super.onResume();

    if (mCamera == null) {

        mCamera = getCameraInstance();

        if (mCamera != null) {
            startPreview();
        } else {
            // process null error here
        }
    }
}

@Override
public void onPause() {
    super.onPause();

    if (mCamera != null) {
        /* stop preview */
        if (inPreview) {
            try {
                mCamera.stopPreview();
            } catch (Exception e) {
                /* ignore: tried to stop a non-existent preview */
            }
        }

        /* release the camera */
        mCamera.release();
        mCamera = null;
        inPreview = false;
    }
} 

我還要檢查是否mCameragetSurface是空的initPreview

private void initPreview(int width, int height) {
    if (mCamera != null && mPreviewHolder.getSurface() != null) {
        try {
            mCamera.setPreviewDisplay(mPreviewHolder);
        } catch (Throwable t) {
            Log.e("PreviewDemo-surfaceCallback",
                    "Exception in setPreviewDisplay()", t);
        }

        if (!cameraConfigured) {
            Camera.Parameters parameters = mCamera.getParameters();
            Camera.Size size = getBestPreviewSize(width, height,
                    parameters);

            if (size != null) {
                parameters.setPreviewSize(size.width, size.height);
                mCamera.setParameters(parameters);
                cameraConfigured = true;
            }
        }
    } else {
        Log.e(TAG, "Camera or getSurface is null");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM