Камера вылетает в Android 2.2 - PullRequest
       72

Камера вылетает в Android 2.2

2 голосов
/ 14 октября 2010

Я протестировал свое приложение на Android SDK на всем от 1.5 до 2.2, и код камеры в моей деятельности работает нормально.Запуск его на устройстве с 2.1 также работает.Но это же приложение не работает с 2.2 на HTC Desire и Nexus One, и приложение вылетает.Есть идеи, почему они могут происходить?

Использую import android.hardware.Camera; .

Внутри onCreate У меня есть это:

preview = (SurfaceView) findViewById(R.id.preview);
        previewHolder = preview.getHolder();
        previewHolder.addCallback(surfaceCallback);
        previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

И обратный вызов

SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        camera.stopPreview();
        camera.release();
        camera = null;
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        camera = Camera.open();
        try {
            camera.setPreviewDisplay(previewHolder);
        } catch (Throwable t) {
            Log.e(TAG, "Exception in setPreviewDisplay", t);
            Toast.makeText(CameraActivity.this, t.getMessage(),
                    Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        Camera.Parameters parameters = camera.getParameters();
        parameters.setPreviewSize(width, height);
        camera.setParameters(parameters);
        camera.startPreview();
    }
};

Ответы [ 3 ]

9 голосов
/ 15 октября 2010

Необходимо установить размер предварительного просмотра камеры после получения оптимальных размеров камеры. Вот подробности и код для исправления -

http://code.google.com/p/android/issues/detail?id=7909

0 голосов
/ 24 января 2013

Вы должны сделать снимок с камеры, затем обрезать и затем сохранить или установить.

Вы можете использовать этот код.

                Intent intent   = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);                  
                mImageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"connectR_" + String.valueOf(System.currentTimeMillis()) + ".jpg"));
                intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
                try {
                    intent.putExtra("return-data", true);                       
                    startActivityForResult(intent, PICK_FROM_CAMERA);
                } catch (ActivityNotFoundException e) {
                    e.printStackTrace();
                }

OnActivityResult.

case PICK_FROM_CAMERA:
            doCrop();               
            break;

теперь обрезка используемого изображения doCrop ()

    final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();      
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setType("image/*");        
    List<ResolveInfo> list = getPackageManager().queryIntentActivities( intent, 0 );        
    int size = list.size();        
    if (size == 0) {            
        Toast.makeText(this, "Can not find image crop app", Toast.LENGTH_SHORT).show();         
        return;
    } else {
        intent.setData(mImageCaptureUri);            
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 200);
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true);

        if (size == 1) {
            Intent i        = new Intent(intent);
            ResolveInfo res = list.get(0);              
            i.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));                
            startActivityForResult(i, CROP_FROM_CAMERA);
        } else {
            for (ResolveInfo res : list) {
                final CropOption co = new CropOption();                 
                co.title    = getPackageManager().getApplicationLabel(res.activityInfo.applicationInfo);
                co.icon     = getPackageManager().getApplicationIcon(res.activityInfo.applicationInfo);
                co.appIntent= new Intent(intent);                   
                co.appIntent.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
                cropOptions.add(co);
            }

            CropOptionAdapter adapter = new CropOptionAdapter(getApplicationContext(), cropOptions);

            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("Choose Crop App");
            builder.setAdapter( adapter, new DialogInterface.OnClickListener() {
                public void onClick( DialogInterface dialog, int item ) {
                    startActivityForResult( cropOptions.get(item).appIntent, CROP_FROM_CAMERA);
                }
            });

            builder.setOnCancelListener( new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel( DialogInterface dialog ) {

                    if (mImageCaptureUri != null ) {
                        getContentResolver().delete(mImageCaptureUri, null, null );
                        mImageCaptureUri = null;
                    }
                }
            } );

            AlertDialog alert = builder.create();

            alert.show();
        }
    }
0 голосов
/ 22 июля 2012

Проблема в том, что ширина и высота, передаваемые методом surfaceChanged, не поддерживаются в размере предварительного просмотра.

Так что, если вы хотите установить размер предварительного просмотра (parameters.setPreviewSize), вам необходимо установить поддерживаемый размер предварительного просмотра. Метод getPreviewSize () возвращает доступный размер предварительного просмотра. Таким образом, ваш метод surfaceChanged может быть таким:

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    Camera.Parameters parameters = camera.getParameters();

    Size pSize = camera.getParameters().getPreviewSize();
    Log.d(TAG, "Setting preview size: " + pSize.width + " x " + pSize.height);

    parameters.setPreviewSize(pSize.width, pSize.height);
    camera.setParameters(parameters);
    camera.startPreview();
}

Вы также можете получить список поддерживаемых размеров предварительного просмотра, используя метод getSupportedPreviewSizes () , доступный в Android API версии 5.

...