Android 相机拍照并保存或发送到下一个活动

Posted

技术标签:

【中文标题】Android 相机拍照并保存或发送到下一个活动【英文标题】:Android Camera Take Picture and SAVE or send to next activity 【发布时间】:2013-06-20 03:42:41 【问题描述】:

我是初学者,我需要帮助。如何用相机拍照并保存或发送到下一个活动?

我尝试了几个选项,即带有图片回调的拍照和有意图的表面视图/拍照。但是,两者都不能在 android 2.3.3 上正常工作。有人能找出我下面代码的问题吗?

@Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sf_foto);
        mCamera = getCameraInstance();
        mCameraPreview = new SF_CameraPreview(this, mCamera);
        FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
        preview.addView(mCameraPreview);

        ImageButton captureButton = (ImageButton) findViewById(R.id.button_capture);
        captureButton.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                mCamera.takePicture(myShutterCallback, mPicture_RAW, mPicture);
            
        );
    

    private Camera getCameraInstance() 
        Camera camera = null;
        try 
            camera = Camera.open(0);
            camera.setDisplayOrientation(90);
         catch (Exception e) 
            // cannot get camera or does not exist
        
        return camera;
    

    ShutterCallback myShutterCallback = new ShutterCallback()
         @Override
         public void onShutter() 
    ;

    PictureCallback mPicture_RAW = new PictureCallback()
         @Override
         public void onPictureTaken(byte[] arg0, Camera arg1) 
    ;

    PictureCallback mPicture = new PictureCallback() 
        @Override
        public void onPictureTaken(byte[] data, Camera camera) 
            File pictureFile = getOutputMediaFile();
            if (pictureFile == null) 
                return;
            
            try 
                FileOutputStream fos = new FileOutputStream(pictureFile);
                fos.write(data);
                fos.flush();
                fos.close();
             catch (FileNotFoundException e) 
                e.printStackTrace();
             catch (IOException e) 
                e.printStackTrace();
             
            Intent i = new Intent(StyloveFoto.this, Filter.class);
            startActivity(i);
        
    ;

    protected File getOutputMediaFile() 
        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),"KWAlbum");
        if (!mediaStorageDir.exists()) 
            if (!mediaStorageDir.mkdirs()) 
                Log.d("KWAlbum", "failed to create directory");
                return null;
            
        
        // Create a media file name
        File mediaFile = new File(mediaStorageDir.getPath() + File.separator + "KW" + ".jpg");

        return mediaFile;
    

我的表面观点:

public class SF_CameraPreview extends SurfaceView implements SurfaceHolder.Callback

    private SurfaceHolder mSurfaceHolder;
    private Camera mCamera;

    public SF_CameraPreview(Context context, Camera camera) 
        super(context);
        this.mCamera = camera;
        this.mSurfaceHolder = this.getHolder();
        this.mSurfaceHolder.addCallback(this);
        this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    

    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) 
        try 
            mCamera.setPreviewDisplay(surfaceHolder);
            mCamera.startPreview();
         catch (IOException e) 
            // left blank for now
        
    

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) 
        //mCamera.stopPreview();
        mCamera.release();
    

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format,
        int width, int height) 
        // start preview with new settings
        try 
            mCamera.setPreviewDisplay(surfaceHolder);
            Camera.Parameters parameters = mCamera.getParameters();
            parameters.set("orientation", "portrait");
            mCamera.setParameters(parameters);
            mCamera.startPreview();
         catch (Exception e) 
            // intentionally left blank for a test
        
    

【问题讨论】:

“无法正常工作”信息量不大。 ICS 和 JB 它在 Gingerbread 上运行得很好,当它被摔倒或者不会打开并且没有保存或照片时。 看到这个链接你得到了答案。 ***.com/questions/15115498/let-user-crop-image/… 现在是 SurfaceCreated 上的 NPE-> mCamera.setPreviewDisplay 【参考方案1】:

代替这一行:fos.write(data);

write : fos.write(data,0,data.length);

如果你想将它传递给下一个活动:

 Intent i = new Intent(StyloveFoto.this, Filter.class);
 i.putExtra("myImage",data);
 startActivity(i);

然后在 oncreate 方法中的类过滤器中

byte[] myImage = getIntent()getIntent().getByteArrayExtra("myImage");

【讨论】:

fos.write(data) 和 fos.write(data,0,data.length) 没有区别。 FileOutputStream 有两种写入字节数组的方法。【参考方案2】:

我遇到了同样的问题,我之前只是解决了它。 问题是mPicturePictureCallback 的对象。您不能设置从StyloveFoto.this 指向Filter.class 的意图,因为它位于PictureCallback 接口中。试试这个:

Intent i = new Intent(getBaseContext() , Filter.class);
startActivity(i);

java 中这么大的陷阱....希望它有所帮助:)

【讨论】:

【参考方案3】:

要么你像这样保存图片并将路径传递给另一个活动

final File file = new File(Environment.getExternalStorageDirectory() + "/" + System.currentTimeMillis() + "_pic.jpg");
        OutputStream output = null;
        try 
            output = new FileOutputStream(file);
            output.write(data);
         catch (IOException e) 
            e.printStackTrace();
         finally 
            if (null != output) 
                try 
                    output.close();
                 catch (IOException e) 
                    e.printStackTrace();
                
            
        

或 从相机活动中传递数据:

Intent intent = new Intent(getApplicationContext(), your_class.class);
    intent.putExtra("path", path);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

接收活动

byte[] data = getIntent().getByteArrayExtra("path");
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
image.setImageBitmap(scaleDownBitmapImage(bitmap, 300, 200));

【讨论】:

以上是关于Android 相机拍照并保存或发送到下一个活动的主要内容,如果未能解决你的问题,请参考以下文章

android固定位置拍照,Android调用系统相机拍照并保存到指定位置

屏幕关闭时Android相机不会拍照

Android:如何调用相机[重复]

Android:如何用相机拍照并将位图转换为字节数组并保存到sqlite db?

Android下载图片/调用系统相机拍照显示并保存到本地

Android 实现拍照功能,并将图片保存到本地存储