0

В моем приложении я хотел бы открыть изображение и загрузить его в приложение с помощью диспетчера файлов. Я уже сделал это с использованием методов Intent.ACTION_GET_CONTENT и onActivityResult(). Все работает отлично, за исключением пути, который я получаю. Он находится в странном формате, и я не могу показать изображение в ImageViewНеверный путь к файлу изображения, полученный из файлового менеджера Android

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == SELECT_PICTURE) { 
      Uri selectedImageUri = data.getData(); 
      mFileManagerString = selectedImageUri.getPath(); 
      showPreviewDialog(mFileManagerString); 
     } 
} 

Здесь mFileManagerString = /document/image:19552

Когда я вызываю метод, чтобы показать изображение в ImageView:

public void setPreviewIV(String pPath) { 
     Bitmap bmImg = BitmapFactory.decodeFile(pPath); 
     receiptPreviewIV.setImageBitmap(bmImg); 
} 

I получить следующую ошибку:

E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /document/image:19552: open failed: ENOENT (No such file or directory) 

Как получить правильный путь к изображению, чтобы я мог показать его в ImageView?

ответ

1

How to get the proper path to the image

У вас уже есть. Это Uri, который передается в onActivityResult() через параметр Intent. Вытягивание всего getPath() из этого Uri бессмысленно. Это похоже на то, что /questions/33827687/wrong-image-file-path-obtained-from-android-file-manager - это путь на вашем жестком диске, просто потому, что ваш веб-браузер показывает URL-адрес, содержащий этот путь.

Кроме того, ваш текущий код загружает и декодирует Bitmap в основной теме приложения. Не делайте этого, потому что он замораживает пользовательский интерфейс, пока эта работа выполняется.

Я рекомендую вам использовать любое из множества image-loading libraries available for Android. Все приличные (например, Picasso, Universal Image Loader) принимают не только входной сигнал Uri, но и загружают изображение в фоновый поток для вас, применяя его к вашему ImageView в основном потоке приложения только тогда, когда битмап готов.

Если по какой-либо причине, вы чувствуете, что вы должны сделать это самостоятельно, использовать ContentResolver и его openInputStream() получить InputStream для данных, представленных Uri. Затем перейдите к decodeStream() по адресу BitmapFactory. Сделайте все это в фоновом потоке (например, doInBackground() из AsyncTask), а затем примените Bitmap к ImageView в основной прикладной нити (например, onPostExecute()AsyncTask).

Смежные вопросы