【问题标题】:Saving photo from camera to a directory in android app fails将照片从相机保存到 android 应用程序中的目录失败
【发布时间】:2013-09-13 17:38:30
【问题描述】:

我正在开发 android 应用程序,该应用程序假设拍摄照片并将其保存在某个目录中。 我已经尝试了 android 开发者网站 (http://developer.android.com/training/camera/photobasics.html) 中的代码,它运行良好。 我对其进行了一些修改并在我的应用程序中使用了一些代码,但它无法创建图片目录,并且我在 Logcat 中收到错误:

09-10 01:32:44.081: D/CameraSample(1477): 未能创建目录

这是我的代码:

public class TakePhoto{
public static final int ACTION_TAKE_PHOTO = 1; 
private static AlbumStorageDirFactory mAlbumStorageDirFactory = null;
private static final String JPEG_FILE_SUFFIX = ".jpg";
private static String mCurrentPhotoPath;
private static final String DEBUG_TAG= "PhotoIntent"; 
private static int counter = 0; 
/* private constructor */
private TakePhoto (){   }

public static File StorageDir(String dirName){
    File storageDir = null;
    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
        Log.d(DEBUG_TAG , counter++ + " GetAlbumName: " + dirName);
        storageDir = mAlbumStorageDirFactory.getAlbumStorageDir(dirName);
        Log.d(DEBUG_TAG , counter++ + " GetAlbumDir: " + storageDir);
        if (storageDir != null) {
            if (! storageDir.mkdirs()) {
                if (! storageDir.exists()){
                    Log.d("CameraSample", "failed to create directory");
                    return null;
                }
            }
        }
    } else {
        Log.v(dirName, "External storage is not mounted READ/WRITE.");
    }

    return storageDir;
}

public static String saveInDir(String dirName){
    File storage =  StorageDir(dirName); 
    if (storage == null){
        storage = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
        if (!storage.mkdir())
            return null; 
    }
    File imageF;
    try {
        imageF = File.createTempFile(setUpPicName() , JPEG_FILE_SUFFIX, storage);
        Log.d(DEBUG_TAG , counter++ + " CreateImageFile: " + imageF.toString() + "  " + imageF.getAbsolutePath());
        mCurrentPhotoPath = imageF.getAbsolutePath();
    } catch (IOException e) {
        e.printStackTrace();
        Log.d(DEBUG_TAG , counter++ + " IOexception: " + mCurrentPhotoPath);
        mCurrentPhotoPath = null; 
    }
    return mCurrentPhotoPath; 
}

public static void setDirFactory(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
        mAlbumStorageDirFactory = new FroyoAlbumDirFactory();
        Log.d(DEBUG_TAG , counter++ + " foryoAlbumDirFactory: ");
        } else {
            mAlbumStorageDirFactory = new BaseAlbumDirFactory();
        }
}

在线:

 storageDir = mAlbumStorageDirFactory.getAlbumStorageDir(dirName);

getAlbumStorageDir 是从 FroyoAlbumDirFactory.java 中调用的:

package beeah.ae.takephoto;
import java.io.File;

import android.os.Environment;
    import android.util.Log;

public final class FroyoAlbumDirFactory extends AlbumStorageDirFactory {

    @Override
    public File getAlbumStorageDir(String albumName) {
        Log.d("FroyoFactory" , "Inside froyofactory");
        return new File(
          Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES
          ), 
          albumName
        );
    }
}

附:当我调试 storageDir 内容时,它给了我:

09-10 01:32:43.971: D/PhotoIntent(1477): 2 GetAlbumDir: /storage/sdcard/Pictures/myPictures

【问题讨论】:

  • 首先您忘记检查媒体是否已安装。请参阅 Ripal Tamboli 的回答。

标签: android camera directory


【解决方案1】:

请在此处发布您的 logcat 错误,并检查您是否已授予权限

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

在您的 manifest.xml 文件中。

【讨论】:

  • 谢谢,我没有设置这个权限.. 但现在我遇到了其他问题,有时当我按下按钮时相机在运行时崩溃,有时它告诉我没有外部存储安装。我该怎么办?
  • 你能把你的整个代码放在这里吗,因为这里缺少处理相机拍照的代码。还要发布该 logcat 错误。所以它将帮助我们跟踪确切的问题。 :)
【解决方案2】:

在将图片保存到外部存储之前,您需要通过编写以下代码检查卡是否已安装。所以它会阻止你的应用在中间崩溃。

Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);

if(isSDPresent)
{
  // continue with your picture saving code
}
else
{
 // show message to user
}

希望这会对您有所帮助。 :)

【讨论】:

  • 谢谢 :D 我认为这是我的问题
猜你喜欢
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多