`getExternalStorageDirectory()`问题 – Android

我正在编写一个Android应用程序,它需要一些图片,并希望将它们全部保存在与我的应用程序相关的唯一目录中。

此目录应该可以从标准库中访问,以便用户以后可以(当应用程序不一定运行时)检查拍摄的图片。

我的问题是,每个不同的手机供应商,具有不同的Android版本,具有不同的图库路径。作为一个例子:

Environment.getExternalStorageDirectory() + Environment.DIRECTORY_PICTURES +"/myFolder" 

将运行Samsung Galaxy Nexus运行android 4.1.1 ,并在Asus Transformer Pad运行android 4.0.3 ,但不在HTC Desire运行android 2.3.5

这将导致我的应用程序在尝试在指定路径中保存新目录时崩溃,如下所述:

 boolean success = false; myFolder = new File( Environment.getExternalStorageDirectory() + Environment.DIRECTORY_PICTURES + "/myFolder" ); if( myFolder.exists() ){ //do nothing }else{ success = dvaFolder.mkdir(); if( success ){ // Do something on success /* * folder has been created */ } else { // Do something else on failure /* * folder creation failed */ throw new RuntimeException("File Error in writing new folder"); } } 

如何编写一个可以在库中访问所有不同供应商和Android版本的目录?

注意:

Logcat没什么用处,因为它只返回运行时exception。

我对蓝牙文件夹有同样的问题,我创建了两种方法来搜索手机上的蓝牙文件夹,通过遍历手机上的整个文件结构。 我写的代码在下面,它有点脏,但在我的情况下它运行得很好

 public List folderSearchBT(File src, String folder) { List result = new ArrayList(); File[] filesAndDirs = src.listFiles(); if (filesAndDirs != null && filesAndDirs.length > 0) { List filesDirs = Arrays.asList(filesAndDirs); for (File file : filesDirs) { result.add(file); // always add, even if directory if (file.isDirectory()) { List deeperList = folderSearchBT(file, folder); result.addAll(deeperList); } } } return result; } 

在此方法中使用上述方法:

 public String searchForGallery() { String splitchar = "/"; File root = Environment.getExternalStorageDirectory(); List btFolder = null; String folder = "gallery"; //your foldername to search for.. btFolder = folderSearchBT(root, folder); if(btFolder.size() < 1) Log.i("btFolder: ", "Empty"); for (int i = 0; i < btFolder.size(); i++) { String g = btFolder.get(i).toString(); String[] subf = g.split(splitchar); String s = subf[subf.length - 1].toUpperCase(); boolean equals = s.equalsIgnoreCase(folder); if (equals) return g; } return null; //not found } 

通过说代码是脏的,我的意思是我可以通过这样的方式写它更紧凑和另一个问题:如果有两个名为bluetooth的文件夹,我卡住了..

我希望我理解你的问题。

这是用于拍照并保存到外部存储器的工作代码,以及用于保存到设备上的“文件”目录的另一种方法。 在我的情况下,我只需要一个图像(something.png),它将在用户拍摄新照片后始终刷新。

用户点击相机按钮时的操作:

 ImageView productImageView = (ImageView) findViewById(R.id.imageView1); static int RESULT_TAKE_PICTURE = 1; String selectedImagePath; Bitmap bitmap; String imageName = "something.png"; public void cameraImageButton_onClick(View view) { Intent cameraIntent = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE); String path = Environment.getExternalStorageDirectory() + File.separator + Environment.DIRECTORY_PICTURES; File dir = new File(path); if (!dir.exists()) { dir.mkdir(); } dir = new File(path, imageName); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(dir)); startActivityForResult(cameraIntent, RESULT_TAKE_PICTURE); } 

对活动结果执行的操作:

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RESULT_TAKE_PICTURE && resultCode == RESULT_OK) { selectedImagePath = Environment.getExternalStorageDirectory() + File.separator + Environment.DIRECTORY_PICTURES + File.separator + imageName; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(selectedImagePath, options); options.inSampleSize = Calculator.calculateInSampleSize(options, 254, 254); options.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeFile(selectedImagePath, options); productImageView.setImageBitmap(bitmap); saveImage(bitmap, imageName); } } 

如果有人需要,将图像保存到文件目录中的设备的奖励方法:

 private void saveImage(Bitmap bitmap, String name) { String path = getApplicationContext().getFilesDir().toString() + File.separator; File dir = new File(path); if (!dir.exists()) { dir.mkdir(); } path = path + name; dir = new File(path); try { dir.createNewFile(); FileOutputStream fos = new FileOutputStream(dir); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.close(); fos.flush(); } catch (IOException e) { e.printStackTrace(); } } 

您应该检查您的应用程序清单中是否包含“WRITE_EXTERNAL_STORAGE”权限,它可能会出现此类错误。 另外,您是否通过打印检查路径是否看起来无效?