Android:保存用户使用相机拍摄的照片

Posted

技术标签:

【中文标题】Android:保存用户使用相机拍摄的照片【英文标题】:Android: Saving Photo User Takes With Camera 【发布时间】:2012-07-06 20:55:19 【问题描述】:

我正在尝试学习如何在我的 android 应用程序中使用相机。我目前有一个带有叠加按钮的工作预览。我已将其设置为成功拍照,但是当我尝试将照片保存到 SD 卡时,它无法正常工作。它总是返回“保存期间出错”。

我知道这不是我的 SD 卡,并且我之前在另一个应用程序中使用了几乎完全相同的代码来保存位图,并且成功运行。

我也知道它正在成功拍照,因为我通过让它将照片放入 Activity 中的 ImageView 来测试它。

我不确定为什么这不起作用。

Button takePhoto = (Button)findViewById(R.id.takephoto);
    takePhoto.setOnClickListener(new View.OnClickListener() 

        @Override
        public void onClick(View arg0) 



            mCamera.takePicture(shutterCallback, rawCallback,
                    jpegCallback);




        
    );







ShutterCallback shutterCallback = new ShutterCallback() 
    public void onShutter() 

    
;

/** Handles data for raw picture */
PictureCallback rawCallback = new PictureCallback() 
    public void onPictureTaken(byte[] arg0, Camera camera) 



    
;

/** Handles data for jpeg picture */
PictureCallback jpegCallback = new PictureCallback() 
    public void onPictureTaken(byte[] arg0, Camera camera) 

        Bitmap photo = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);

        tempSavePhoto(photo);

        switchToPolaroidView();

    
;



public void tempSavePhoto(Bitmap photo)

    File root = new File(Environment.getExternalStorageDirectory() + File.separator + "Photos");
    File image = new File(root, "toSend.jpg");
    sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

    boolean success = false;

    FileOutputStream outStream;
    try 

        outStream = new FileOutputStream(image);
        photo.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
        /* 100 to keep full quality of the image */

        outStream.flush();
        outStream.close();
        success = true;
     catch (FileNotFoundException e) 
        e.printStackTrace();
     catch (IOException e) 
        e.printStackTrace();
    

    if (success) 
        Toast.makeText(getApplicationContext(), "Saved successfully",
                Toast.LENGTH_SHORT).show();
     else 
        Toast.makeText(getApplicationContext(),
                "Error during image saving", Toast.LENGTH_SHORT).show();
    

【问题讨论】:

没有错误。它只是不保存。我得到祝酒词告诉我程序中有错误 【参考方案1】:

将此添加到您的清单中

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

这个应用程序很可能没有权限保存到您的其他应用程序的 SDCard。添加此授予权限

【讨论】:

【参考方案2】:

我尝试了一种不同的方法,它奏效了。不知道为什么另一个不工作,但它现在保存照片就好了。这是我改用的:

public void tempSavePhoto(Bitmap photo)

    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    photo.compress(Bitmap.CompressFormat.JPEG, 40, bytes);


    File f = new File(Environment.getExternalStorageDirectory()
                            + File.separator + "test.jpg");
    try 
        f.createNewFile();
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    

    FileOutputStream fo = null;
    try 
        fo = new FileOutputStream(f);
     catch (FileNotFoundException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    
    try 
        fo.write(bytes.toByteArray());
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));



请注意,我是从 this post 得到这个想法的,并投票赞成对我有帮助的答案。

【讨论】:

以上是关于Android:保存用户使用相机拍摄的照片的主要内容,如果未能解决你的问题,请参考以下文章

避免图库保存在Android中使用相机拍摄的照片

用相机意图拍摄照片并将其保存到文件中

Android笔记67Android之使用系统中的相机功能(拍照保存照片显示拍摄的照片照片保存到图库等操作)

Android 使用系统相机拍摄照片保存到本地并在系统相册中显示

如何使用 Cordova 相机插件拍摄多张照片

如何让用户选择在保存之前裁剪从相机拍摄的照片?