0

私のアプリユーザーは、画像ボタンをクリックしてギャラリーから画像を選択し、その画像を画像ボタンに設定できます。しかし問題は、5MB以上のサイズの画像の場合、ギャラリーから私の活動に戻るまでには非常に時間がかかり、画面は数秒間黒くなります。私は選択されたイメージ上で何も操作をしない、私はユーザーによって選択されたイメージのパスを取得したい。ギャラリーから画像を選択するのに時間がかかりすぎる

AsyncTaskでイメージピッキングができないようです。それでは、大きな画像に対してどのように画像ピッキング処理を行うことができますか?

私はlogcatにギャラリーから大きな画像を選ぶとき、私は、アプリケーションがそのメインスレッド上であまりにも多くの仕事をやっても

を受けます。

+2

「選択した画像のパスをユーザーが取得したいだけです」 - パスはありません。それを超えて、[mcve]を提供してください。 – CommonsWare

+0

あなたが 'onActivityResult'で何をしようとしているのか、それを見せてもらえますか? –

答えて

0

Nabinは、あなたがAsyncTaskで画像処理を行うことができます答えとしては、私はあなたのための小さな例を作成しました:

public class MainActivity extends AppCompatActivity { 

    public static final int PICK_IMAGE = 1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(); 
       intent.setType("image/*"); 
       intent.setAction(Intent.ACTION_GET_CONTENT); 
       startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE); 
      } 
     }); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == PICK_IMAGE) { 
      Uri imagePath = data.getData(); 
      new LoadImageDataTask(imagePath).execute(); 
     } 
    } 

    private class LoadImageDataTask extends AsyncTask<Void, Void, Bitmap> { 

     private Uri imagePath; 

     LoadImageDataTask(Uri imagePath) { 
      this.imagePath = imagePath; 
     } 

     @Override 
     protected Bitmap doInBackground(Void... params) { 
      try { 
       InputStream imageStream = getContentResolver().openInputStream(imagePath); 
       return BitmapFactory.decodeStream(imageStream); 
      } catch (FileNotFoundException e) { 
       Toast.makeText(MainActivity.this, "The file " + imagePath + " does not exists", 
         Toast.LENGTH_SHORT).show(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Bitmap bitmap) { 
      super.onPostExecute(bitmap); 
      Toast.makeText(MainActivity.this, "I got the image data, with size: " + 
          Formatter.formatFileSize(MainActivity.this, bitmap.getByteCount()), 
        Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

バックグラウンドで仕事をして、凍結からアプリケーションを防ぐことができます。私は60MB以上のサイズの画像をかなり早く選択することもできます。

+0

私は例が必要でした、それは私を助けました。 – Masoud

1

AsyncTaskの内部で画像をピックアップできない場合があります。しかし、画像ファイル/ Uriからのビットマップのデコードは確実にAsyncTaskで行うことができます。

ImageButtonで画像を使用しているため、フルサイズの画像を使用する必要はありません。デコードされたビットマップのサイズを縮小するには、Options#inSampleSizeを使用します。

関連する問題