FileNotFoundException при извлечении изображения из внутреннего хранилища

Файлы ==> введите здесь описание изображения==> введите здесь описание изображения

Как показано на этом рисунке, мое изображение (960-Minimalism.jpg) находится во внутренней памяти телефона, и я пытаюсь получить его путь для дальнейшего использования через класс File.

Что я еще пробовал

1st:

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

2nd:

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

Я знаю, что что-то упускаю или делаю что-то не так, но до сих пор не могу понять.

Есть идеи..

ИЗМЕНИТЬ

Пожалуйста, не думайте, что у меня три проблемы. Выше приведены мои проверенные решения, которые не сработали. Но проблема в том, что я хочу получить путь к изображению, который находится в моей внутренней памяти. Вот почему я удалил свои исключения здесь.


person Ranjit    schedule 25.02.2014    source источник
comment
На самом деле, каков путь к вашему файлу изображения?   -  person Lucifer    schedule 25.02.2014
comment
Попробуйте этот путь File file = new File(Environment.getExternalStorageDirectory()+ "960-Minimalism.jpg");   -  person Lucifer    schedule 25.02.2014
comment
ваши файлы директора или файлы?   -  person Padma Kumar    schedule 25.02.2014
comment
его файлы ... которые находятся в главном меню, и все мы это знаем ... внутри которых принадлежит мое 1-е изображение ...   -  person Ranjit    schedule 25.02.2014
comment
@RanjitPati, ты пробовал путь?   -  person Lucifer    schedule 25.02.2014
comment
@Kedarnath, я уже пробовал .. та же проблема ..   -  person Ranjit    schedule 25.02.2014
comment
@RanjitPati, хорошо, когда вы выполняете это, отсоедините USB-кабель и повторите попытку. Иногда, когда USB-кабель подключен, телефон не может использовать SD-карту (для некоторых конкретных моделей)   -  person Lucifer    schedule 25.02.2014


Ответы (4)


Вместо того, чтобы указывать путь, вы можете сделать наоборот. Откройте галерею телефона и выберите нужный файл, затем получите файл uri и используйте его. У меня была аналогичная проблема, и я решил ее таким образом. И иногда расширение файла jpeg, но он показывает там jpg и выдает ошибку. Если бы вы могли проверить детали файла для правильного расширения файла

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

Теперь у вас есть растровое изображение, которое вы можете использовать. Но обязательно вызовите метод 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 для своего изображения. Надеюсь, поможет.

person 1011    schedule 25.02.2014
comment
Проблема в том, что я должен отправить файл, а не растровое изображение. В любом случае, это также возможное решение, поэтому я проголосовал за него. - person Ranjit; 25.02.2014
comment
Использование растрового способа. Сохраните растровое изображение, а затем, как только оно будет сохранено, отправьте путь к файлу и после сохранения уничтожьте растровое изображение. - person 1011; 25.02.2014
comment
Я немного изменил ваш ответ и добавил сюда ... спасибо за хорошее предложение ... ваш ответ дает мне путь решения, поэтому я его принял ... - person Ranjit; 25.02.2014

Для решения вашей второй проблемы добавьте эти два разрешения в файл Manifest...

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
person Hamid Shatu    schedule 25.02.2014
comment
я пробовал все вышеперечисленные решения ... но моя проблема заключается в том, как успешно получить этот путь к изображению ... и, к сожалению, я забыл добавить разрешения ... но добавить разрешение - это не мое решение ... - person Ranjit; 25.02.2014

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, потому что оно неявно также требует доступа для чтения.

person Padma Kumar    schedule 25.02.2014
comment
Он хочет получать данные из внутреннего хранилища, а не из внешнего хранилища. - person InnocentKiller; 25.02.2014
comment
@InnocentKiller Я вижу здесь строку в Exception: (Отказано в доступе) - person Padma Kumar; 25.02.2014

Я просто немного меняю, как предложил 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) поможет получить реальный путь с идеальным расширением файла.

person Ranjit    schedule 25.02.2014