2017-02-22 10 views
0

Я знаю, что есть несколько других вопросов по этой теме, но ни одно из решений не работало для меня. Я добавил разрешения в свой манифест. Я могу открыть галерею, выбрать фотографию и вернуться к приложению, но изображение не изменится. Приложение выполняет некоторую обработку, и я не получаю никаких ошибок. Я попытался также попытаться масштабировать изображение, прежде чем вставлять его в мое изображение без везения.Изображение, загруженное из галереи, не отображается в ImageView

Вот мой код:

public class UserDetailsFragment extends Fragment { 
private Context context; 
private ImageView imageView; 
private Bitmap uploadedImage; 
public static final int RESULT_IMAGE = 0; 


public UserDetailsFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    context = getActivity(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_user_details, container, false); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState){ 
    imageView = (ImageView) getView().findViewById(R.id.profile_picture); 
    imageView.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      startActivityForResult(i, RESULT_IMAGE); 
     } 
    }); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(resultCode == RESULT_OK){ 
     Uri selectedImage = data.getData(); 
     String[] filePathColumn = {MediaStore.Images.Media.DATA}; 
     Cursor cursor = context.getContentResolver().query(
       selectedImage, filePathColumn, null, null, null); 
     cursor.moveToFirst(); 
     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     String filePath = cursor.getString(columnIndex); 
     cursor.close(); 
     try { 
      InputStream in = new URL(filePath).openStream(); 
      uploadedImage = BitmapFactory.decodeStream(in); 
      imageView.setImageBitmap(uploadedImage); 
     }catch (Exception ex){ 

     } 
    } 
} 

}

Вот мой ImageView:

<ImageView 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:layout_marginTop="-160dp" 
    android:layout_gravity="center" 
    android:layout_below="@+id/imageView" 
    android:src="@drawable/user_details_icon" 
    android:id="@+id/profile_picture" /> 

EDIT

Я пытался использовать Пикассо, но вместо этого до сих пор не повезло :

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(resultCode == RESULT_OK){ 


     Picasso.with(context) 
       .load(MediaStore.Images.Media.DATA) 
       .resize(10, 10) 
       .centerCrop() 
       .into(imageView); 

    } 
+2

Во-первых, ** никогда не поймайте 'Exception' без регистрации его **, так как вы' onActivityResult() '. Во-вторых, ваш код 'onActivityResult()' неправильный, так как у вас могут не быть прав на работу с файловым путем (например, он указывает на съемное хранилище), и вы делаете дисковый ввод-вывод в основном потоке приложения. Используйте [библиотеку загрузки изображений] (https://android-arsenal.com/tag/46), например [Picasso] (https://github.com/square/picasso), передав ей 'Uri' для обоих используйте 'Uri' правильно и для асинхронного заполнения вашего ImageView. – CommonsWare

+0

Спасибо за подсказку. Я довольно новичок в Android, поэтому я действительно не знал о Пикассо. Я не уверен, что понимаю, что вы имеете в виду в onActivityResult(), но я попытался изменить его на внутреннее хранилище, но все равно не повезло. Я также изменил весь свой onActivityResult (см. Править), но до сих пор не повезло – Andypandy

ответ

0

Я попытался не использовать Пикассо, но вместо этого до сих пор не повезло:

Это потому, что вы не используете правильный Uri. Вы используете Uri, который указывает на всю коллекцию сканированных носителей.

Если вы читали the documentation for ACTION_PICK, то есть:

Выходные данные: URI элемента, который был выбран.

Здесь Uri в вопросе получается вызовом getData() на Intent доставлены onActivityResult().

Итак, замените на .load(data.getData()).

Также, скорее всего, вам нужно увеличить размер изображения, так как изображение 10px x 10px будет довольно маленьким.

+0

Теперь я получаю E/MiniThumbFile: Не удалось создать каталог .thumbnails /storage/emulated/0/DCIM/.thumbnails – Andypandy

+0

@Andypandy: Убедитесь, что у вас есть 'WRITE_EXTERNAL_STORAGE' как разрешение, включая обработку разрешений времени выполнения, если ваша' targetSdkVersion' равна 23 или выше. – CommonsWare

+0

Я добавил разрешения для чтения и записи внешнего хранилища в моем манифесте. my target sdk is 19 – Andypandy

1

В вашем предыдущем коде, проблема заключается в следующих строках:

InputStream in = new URL(filePath).openStream(); 
uploadedImage = BitmapFactory.decodeStream(in); 

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

/storage/emulated/0/DCIM/Camera/IMG_20170209_183830841.jpg

, когда вы передаете его в новый URL() в качестве параметра, он создает следующее исключение

java.net.MalformedURLException: Протокол не найден

В вашем случае в первую очередь вам нужно добавить READ_EXTERNAL_STORAGE разрешение в вашем файле манифеста и в onActivityResult(), вы должны заменить

InputStream in = new URL(filePath).openStream(); 
uploadedImage = BitmapFactory.decodeStream(in); 

с

File image = new File(filePath); 
BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
Bitmap bitmap = BitmapFactory.decodeFile(image.getAbsolutePath(), bmOptions); 
bitmap = Bitmap.createScaledBitmap(bitmap, imageView.getWidth(), imageView.getHeight(), true); 

Примечание: в случае зефира, не забудьте добавить разрешение безопасности в ваш код.

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