2016-05-09 9 views
0

私のエミュレータ(api 22)で のギャラリーから写真をアップロードしようとしていますが、私の電話機(api 23)では何らかの理由で画像がうまくいかない場合は、空のページを表示しないでください。SetImageBitMapがapi 23で動作していません。

public class Photoactivity extends Activity { 

private static final int SELECTED_PICTURE=1; 
ImageView iv; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_photoactivity); 

    iv=(ImageView)findViewById(R.id.ImgView); 
} 
public void btnClick(View v){ 
     Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
     startActivityForResult(i, SELECTED_PICTURE); 

} 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 

    switch (requestCode) { 
     case SELECTED_PICTURE: 
      if(resultCode==RESULT_OK){ 
       Uri selectedImage = data.getData(); 
       String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
       Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null); 
       cursor.moveToFirst(); 
       int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
       String picturePath = cursor.getString(columnIndex); 
       cursor.close(); 
       ImageView imageView = (ImageView) findViewById(R.id.ImgView); 
       imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); 

      } 
      break; 

     default: 
      break; 
    } 

} 

}

答えて

1

これを置き換えます:これで

case SELECTED_PICTURE: 
     if(resultCode==RESULT_OK){ 
      Uri selectedImage = data.getData(); 
      String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
      Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null); 
      cursor.moveToFirst(); 
      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      String picturePath = cursor.getString(columnIndex); 
      cursor.close(); 
      ImageView imageView = (ImageView) findViewById(R.id.ImgView); 
      imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); 

     } 
     break; 

case SELECTED_PICTURE: 
     if(resultCode==RESULT_OK){ 
      InputStream is=getContentResolver().openInputStream(data.getData()); 
      imageView.setImageBitmap(BitmapFactory.decodeStream(is)); 
     } 
     break; 

さらに良いことに、スイッチan image-loading libraryを使用して、そのようなことが重要ならば は、ここに私のコードですPicassoというように、このI/Oはバックグラウンドで実行できますイメージが読み込まれている間、UIはフリーズしません。

0

うまくいきます。しかし、あなたがそれを行う方法ではありません。 onActivityResultでイメージを取得するときにuriを使用してファイルパスを見つけたら、ファイルをデコードします。問題は、api23で要求する必要のある外部ストレージ権限を読み取る必要があることです。しかし、あなたはする必要はありません! ストリームを解析することで、uriからBitmapを直接取得するだけです。 (同様api23上の)コードを作業から 例:

Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(data.getData())); 
imageView.setImageBitmap(bitmap); 

あなたはドンこう; tは、ファイルにアクセスする必要があります。したがって、外部ストレージを読み取るためのアクセス権は必要ありません。

関連する問題