2017-07-07 58 views
2

我已經和ImageView的,它應該是充滿圖像從畫廊與此代碼:setImageBitmap()不工作

Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT); 
      getIntent.setType("image/*"); 
      Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      pickIntent.setType("image/*"); 

      Intent chooserIntent = Intent.createChooser(getIntent, "Pick an image."); 
      chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent}); 

      startActivityForResult(chooserIntent, PICK_IMAGE_REQUEST); 

現在,一切都很好在這部分代碼,問題是在onActivityResult()中,完全在setImageBitmap()中,因爲imageView沒有采用來自Gallery的圖像。這是onActivityResult()代碼:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if(requestCode == PICK_IMAGE_REQUEST || resultCode == PromoUpload.RESULT_OK){ 

     Uri selectedImage = data.getData(); 
     String[] filepathColumm = {MediaStore.Images.Media.DATA}; 

     Cursor cursor = getContentResolver().query(selectedImage, filepathColumm, null, null, null); 
     cursor.moveToFirst(); 

     int columnIndex = cursor.getColumnIndex(filepathColumm[0]); 
     String picturePath = cursor.getString(columnIndex); 
     cursor.close(); 

     Bitmap bitmap = BitmapFactory.decodeFile(picturePath); 
     imagePromo.setImageBitmap(bitmap); 
     pictureFlag = 1; 

    } 

我敬酒picturePath屬性和它的顯示OK,問題正是在這裏:

Bitmap bitmap = BitmapFactory.decodeFile(picturePath); 
    imagePromo.setImageBitmap(bitmap); 

但我不知道我在做什麼錯誤。這是ImageView的的XML:

<ImageView 
     android:id="@+id/imageView_promo" 
     android:layout_width="300dp" 
     android:layout_height="300dp" 
     android:layout_centerHorizontal="true" 
     android:padding="1dp" /> 

我也嘗試選擇從多個尺寸的圖像,但它似乎沒有工作...

回答

2

但我不知道我做錯了

你假設每個Uri來自MediaStore,並且MediaStore中的每個條目都有一個有用的路徑。這兩個都不是真的。

什麼,你應該做的是通過selectedImage到的圖像加載庫(滑翔,畢加索等),因爲這些圖書館不僅知道如何正確使用Uri,但他們會做一個圖像加載後臺線程,而不是像在這裏一樣凍結UI。您還可以教導圖像加載庫來縮放圖像以適應您的需求,以節省堆空間。

更直接替換你的代碼是:

Uri selectedImage = data.getData(); 
    Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage)); 
    imagePromo.setImageBitmap(bitmap); 
    pictureFlag = 1; 

但是,如上所述,這將會凍結您的UI,同時磁盤I/O和圖像解碼是怎麼回事。

+0

謝謝!替換幫助。無論如何,正如你所說,我會嘗試將Glide或畢加索實施到我的項目中。 –

0

會幫這個,

BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
Bitmap bitmap = BitmapFactory.decodeFile(picturePath,bmOptions); 
imageView.setImageBitmap(bitmap); 
相關問題