从内部存储获取映像时出现FileNotFoundException

时间:2014-02-25 06:13:46

标签: java android file filenotfoundexception

文件 ==> enter image description here ==> enter image description here

正如我在这个图片流中所展示的那样,我的图像(960-Minimalism.jpg)位于内部手机存储中,我正试图通过File类获取它的进一步使用路径。

  

我还尝试过什么

第一名:

String filePath = MainActivity.this.getFilesDir().getAbsolutePath();
File file = new File(filePath, "960-Minimalism.jpg");

第二

File file = new File(Environment.getExternalStorageDirectory()+ "/Android/data/"+ getApplicationContext().getPackageName()
        + "/Files/"+"960-Minimalism.jpg");

极端硬编码方式:

File file = new File("/data/data/com.example.net/files/","960-Minimalism.jpg")

此处的异常与第一个相同..

我知道我在这里错过了什么或做错了什么但到目前为止都找不到。

任何想法..

修改

请不要认为我有三个问题。以上是我尝试过的解决方案,但没有奏效。但问题是我想要获取内部存储器中的图像路径。这就是我在这里删除我的例外的原因。

4 个答案:

答案 0 :(得分:3)

而不是给出路径,你可以做其他方式。打开手机库并选择您需要的文件,然后获取文件uri并使用它。我遇到过类似的问题而且我已经解决了这个问题。有时文件的扩展名为jpeg,但它会显示jpg并给出错误。如果您可以检查文件详细信息以获取正确的文件 扩展

String filepath = Environment.getExternalStorageDirectory().getAbsolutePath() +...(insert specific file path)
        Bitmap bitmap = BitmapFactory.decodeFile(filepath);

现在您有了一个可以使用的位图。但是一旦完成以防止内存泄漏,请务必在bit上调用recycle()`方法。

要获取File Uri,您可以尝试使用我从我的某个项目中直接粘贴的代码

  Intent i = new Intent(
                Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

        startActivityForResult(i, RESULT_LOAD_IMAGE);

这将打开图库供您选择图像。一旦你完成了。覆盖onActivityResult方法如下。

  @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && null != data) {
               Uri file = data.getData(); 
              }
else{
// no file selected
}
    }

您可以使用此文件Uri来满足您的图像需求。希望它有所帮助。

答案 1 :(得分:2)

Getting access to external storage

要在外部存储上读取或写入文件,您的应用必须获取READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE系统权限。例如:

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

如果您需要同时读取和写入文件,那么您只需要WRITE_EXTERNAL_STORAGE权限,因为它也隐含地要求读取权限。

答案 2 :(得分:2)

对于第二次问题,请将这两项权限添加到Manifest文件...

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

答案 3 :(得分:1)

我只需改变一点1011建议并获得解决方案。

第一个问题是连接设备(通过数据线),它在内存存储和应用程序之间造成障碍。据我所知,物理连接禁止设备共享其内部存储器和SD卡文件。

对于解决方案,我按照1011的回答做了类似的事情:

Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE);

并且在onActivityResult内部我抓住了uri并试图通过一点modified way来获取路径......类似于:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (resultCode == RESULT_OK && null != data) {
    Uri selectedImageURI = data.getData();
    File imageFile = new File(getRealPathFromURI(selectedImageURI));
    File file1 = new File(file.getPath());
    if(imageFile.exists()){
         Toast.makeText(MainActivity.this, "File Exists..:", Toast.LENGTH_SHORT).show();
    }
    else{
             Toast.makeText(MainActivity.this, "NOooooooooo..:", Toast.LENGTH_SHORT).show();
    }
  }else {
        // no file selected
  }
}

//method to get the real path with file extension
private String getRealPathFromURI(Uri contentURI) {
    String result;
    Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
    if (cursor == null) { // Source is Dropbox or other similar local file path
        result = contentURI.getPath();
    } else { 
        cursor.moveToFirst(); 
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
        result = cursor.getString(idx);
        cursor.close();
    }
    return result;
}

方法getRealPathFromURI(Uri contentUri)将有助于获得完美文件扩展名的真实路径。