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

男子,当我发送要求拍照的意图时,我仍然无法保存图片。 这是我在做什么:

  1. build立一个代表path名的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. 创build意图(不要忘记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. 我可以创build缩略图确定(通过不把额外的意图),并可以写入该文件确定,以后再读回来)。

任何人都可以看到我正在做什么简单的错误? logcat中没有任何明显的performance – 相机显然是拍照的。 谢谢,

彼得


我应该提到,我在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> 

有任何想法吗? 任何想法的东西尝试,以获得有关问题的更多信息?

Solutions Collecting From Web of "将照片保存到文件时出现问题"

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

  2. 正如stealthcopter所说,意图额外的只是MediaStore.EXTRA_OUTPUT没有你的包名称。

  3. 这只是FYI的问题。 我想这个操作实际上不需要你指定的任何权限。

这是我的代码示例:

 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. } } 

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

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

代替:

  intent.putExtra("com.droidstogo.boom1" 

您的问题可能与您试图存储该文件的目录有关。要将文件保存到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日起,时间节省了几毫秒,因为某种原因也被称为“时代”。)

正如史蒂夫说,你应该把你的照片保存在SD卡中。 您尝试保存的目录是私人的,除非您拥有设备的根目录,否则您将无法在该目录中写入。 尝试replace这一行:

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

用这条线

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

这应该够了。