将照片保存到文件时出现问题

时间:2010-04-23 04:54:12

标签: android image file camera save

当我发送要求拍摄照片的意图时,我无法保存图片。这就是我在做的事情:

  1. 创建一个表示路径名的URI

    android.content.Context c = getApplicationContext(); 
    
    String fname = c.getFilesDir().getAbsolutePath()+"/parked.jpg";
    
    java.io.File file = new java.io.File( fname ); 
    
    Uri fileUri = Uri.fromFile(file);
    
  2. 创建Intent(不要忘记pkg名称!)并启动活动

    private static int TAKE_PICTURE = 22;
    
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE );
    
    intent.putExtra("com.droidstogo.boom1." + MediaStore.EXTRA_OUTPUT, fileUri);
    startActivityForResult( intent, TAKE_PICTURE );
    
  3. 相机活动开始,我可以拍照并批准。我的onActivityResult()随后被调用。但我的文件没有写。 URI为:file:///data/data/com.droidstogo.boom1/files/parked.jpg

  4. 我可以创建缩略图OK(通过不将额外的内容放入Intent中),并且可以将该文件写入OK,然后再将其读回来。

  5. 谁能看到我犯的是什么简单的错误?在logcat中没有任何明显的东西 - 相机显然正在拍照。谢谢,

    彼得


    我应该提一下,我在AndroidManifest.xml文件中设置了相应的权限:

        <uses-permission android:name="android.permission.READ_OWNER_DATA" />
        <uses-permission android:name="android.permission.WRITE_OWNER_DATA" />
    
        <uses-permission android:name="android.permission.CAMERA" />
    
        <uses-feature android:name="android.hardware.camera" />
        <uses-library android:name="com.google.android.maps" />
    
    
    
    </application>
    

    有什么想法吗?关于要尝试的事情的任何想法,以获得有关该问题的更多信息?

4 个答案:

答案 0 :(得分:7)

  1. 正如Steve H所说,你不能只使用file:///data/data/com.droidstogo.boom1/files/parked.jpg。这是你的应用程序私人目录,相机无法在那里写。例如,您可以使用某些SD卡文件 - 它可供所有人使用。

  2. 正如stealthcopter所说,intent extra只是没有你的包名的MediaStore.EXTRA_OUTPUT。

  3. 仅仅是FYI不是问题。我想这个操作实际上并不需要您指定的权限。

  4. 这是我的代码示例:

    final int REQUEST_FROM_CAMERA=1;
    
    private File getTempFile()
    {
        //it will return /sdcard/image.tmp
        return new File(Environment.getExternalStorageDirectory(),  "image.tmp");
    }
    
    private void getPhotoClick()
    {
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(getTempFile()));
      startActivityForResult(intent, REQUEST_FROM_CAMERA);
    }
    
    
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      if (requestCode == REQUEST_FROM_CAMERA && resultCode == RESULT_OK) {
        InputStream is=null;
    
        File file=getTempFile();
        try {
            is=new FileInputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    
        //On HTC Hero the requested file will not be created. Because HTC Hero has custom camera
        //app implementation and it works another way. It doesn't write to a file but instead
        //it writes to media gallery and returns uri in intent. More info can be found here:
        //http://stackoverflow.com/questions/1910608/android-actionimagecapture-intent
        //http://code.google.com/p/android/issues/detail?id=1480
        //So here's the workaround:
        if(is==null){
            try {
                Uri u = data.getData();
                is=getContentResolver().openInputStream(u);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    
        //Now "is" stream contains the required photo, you can process it
        DoSomeProcessing(is);
    
        //don't forget to remove the temp file when it's not required. 
      }
    
    }
    

答案 1 :(得分:1)

是不是因为你添加了一个额外的点:

 intent.putExtra("com.droidstogo.boom1."

而不是:

 intent.putExtra("com.droidstogo.boom1"

答案 2 :(得分:1)

您的问题可能出在您尝试存储文件的目录中。要将文件保存到SD卡,您不需要任何特殊权限,但获取文件夹参考的方式与您的方式不同做完了。它还取决于您是否要以MediaStore可以检索的方式保存图像(即图库或相册应用程序之类的东西,或者依赖于那些查找图像的任何其他应用程序)。假设您希望它在MediaStore中列出,请执行以下代码:

ContentValues newImage = new ContentValues(2);
newImage.put(Media.DISPLAY_NAME, "whatever name you want shown");
newImage.put(Media.MIME_TYPE, "image/png");

Uri uri = contentResolver.insert(Media.EXTERNAL_CONTENT_URI, newImage);

try {
    Bitmap bitmap = //get your bitmap from the Camera, however that's done  
    OutputStream out = contentResolver.openOutputStream(uri);
    boolean success = bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
    out.close();
    if (success){
        Log.d("Image Writer", "Image written successfully.");                   
    } else {
        Log.d("Image Writer", "Image write failed, but without an explanation.");
    }

} catch (Exception e){
    Log.d("Image Writer", "Problem with the image. Stacktrace: ", e);
}

在我运行v1.5的模拟器上,它已成功将位图保存到DCIM / Camera文件夹中的SD卡上,其文件名为当前时间。 (自1970年1月1日以来,时间以毫秒为单位保存,出于某种原因也被称为“大纪元”。)

答案 3 :(得分:0)

史蒂夫说,你应该将照片保存在SD卡中。您尝试保存的目录是私有的,除非您将设备设置为root,否则您将无法在此处写入。 请尝试替换此行:

String fname = c.getFilesDir().getAbsolutePath()+"/parked.jpg";

这一行

String fname = Environment.getExternalStorageDirectory().getAbsolutePath() + "somePathYouKnownExists" + +"/parked.jpg";

这应该足够了。