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

档案==> 在此处输入图像描述 ==> 在此处输入图像描述

正如我在这个图片流中所展示的那样,我的图像(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") 

这里的例外情况与第1期相同

我知道我在这里遗失了一些东西或做错了什么但是到现在为止还没找到。

任何的想法..

编辑

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

而不是给出路径,你可以做其他方式。 打开手机图库并选择所需的文件,然后获取文件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来满足您的图像需求。 希望能帮助到你。

对于您的第二个问题,请将这两个权限添加到您的Manifest文件中……

   
 Getting access to external storage 

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

   ...  

如果您需要同时读取和写入文件,则只需要请求WRITE_EXTERNAL_STORAGE权限,因为它也隐式地要求读取访问权限。

我只是改变一点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并试图通过一些修改的方式获取路径..类似于:

 @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)将有助于获得具有完美文件扩展名的真实路径。