无法保存相机在SD卡上拍摄的照片

时间:2016-02-01 17:00:40

标签: android android-camera android-sdcard

我有一个使用Camera API的应用程序,它会通过调用拍摄照片

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

mCamera.takePicture(shutterCallback, rawCallback, mPicture);
mCamera.startPreview();

mPicture定义为

private Camera.PictureCallback mPicture = new Camera.PictureCallback() {

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
        if (pictureFile == null){
            Log.d(TAG, "Error creating media file, check storage permissions: " /* +
                    e.getMessage()*/);
            Toast.makeText(MainActivity.this, "Failed to write Photo to File", Toast.LENGTH_SHORT);
            return;
        }

        try {
            FileOutputStream fos = new FileOutputStream(pictureFile);
            Toast.makeText(MainActivity.this, "Writing Photo to File", Toast.LENGTH_SHORT);
            fos.write(data);
            fos.flush();
            fos.close();
        } catch (FileNotFoundException e) {
            Log.d(TAG, "File not found: " + e.getMessage());
        } catch (IOException e) {
            Log.d(TAG, "Error accessing file: " + e.getMessage());
        }
    }
};


public static File getOutputMediaFile(int type){
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this.



    File sdCard = Environment.getExternalStorageDirectory();
    File dir = new File(sdCard.getAbsolutePath() + "/camtest");
    dir.mkdirs();

    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE){
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        mediaFile = new File(dir, "IMG_"+ timeStamp + ".jpg");
    } else {
        return null;
    }
    return mediaFile;
}

为什么没有保存任何图片?我去了我的画廊&amp;文件管理器应用程序检查,没有。 我也注意到当我退出应用程序时我的应用程序崩溃了,这可能是为什么?

我的onPause方法如下

@Override
protected void onPause() {
    mSensorManager.unregisterListener(mShakeDetector);
    letGo();
    super.onPause();
}
private void letGo(){
    if(mCamera != null){
        mCamera.stopPreview();
        mCamera.setPreviewCallback(null);
        cameraPreview.getHolder().removeCallback(cameraPreview);
        mCamera.release();
        mCamera = null;
    }
}

1 个答案:

答案 0 :(得分:0)

  

为什么没有保存任何图片?

他们完全有可能得救。但是,请记住,您正在主应用程序线程上执行磁盘I / O;根据{{​​1}}设置,您可能会因此I / O而崩溃。

如果没有保存图片,您应该在LogCat中看到您的日志消息。不过,我建议将它们切换到错误严重性(StrictMode)。

  

我去了我的画廊&amp;文件管理器应用程序检查,没有。

它们不会出现在设备“图库”式应用程序中,也不会出现在桌面操作系统的文件管理器中很长一段时间。这是因为这些工具使用Log.e()来查看存在的内容,而您还没有安排将文件编入MediaStore的索引。为此,请使用MediaStore及其MediaScannerConnection方法。

  

我还注意到退出应用时我的应用崩溃了

Use LogCat to examine the Java stack trace associated with your crash