0

이미지 버튼을 클릭 한 다음 갤러리에서 이미지를 선택한 다음 해당 이미지가 이미지 버튼으로 설정됩니다. 그러나 문제는 크기가 5MB 이상인 이미지의 경우 갤러리에서 내 활동으로 돌아 오는 데 시간이 오래 걸리며 화면이 몇 초 동안 검은 색이됩니다. 선택한 이미지에서 아무런 조작을하지 않고, 사용자가 선택한 이미지의 경로 만 가져오고 싶습니다.내 앱 사용자가 갤러리에서 이미지를 선택하는 데 너무 오래 걸리는 경우

AsyncTask 내에서 이미지 피킹을 수행 할 수없는 것 같습니다. 그렇다면 큰 이미지의 경우 이미지 픽킹 프로세스를 어떻게 처리 할 수 ​​있습니까?

내가 로그 캣의 갤러리에서 큰 이미지를 선택

나는 응용 프로그램은 주 스레드에서 너무 많은 일을 할 수있다

받을 수 있습니다.

+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을 사용하십시오.

관련 문제