0

我有一個ImageButton,當我點擊它時,它會給我一個AlertDialog以將圖像添加到我的Imagebutton。當我添加圖片時,該應用程序變得非常緩慢和遲緩。如果我想重新選擇一個圖像,那麼應用程序崩潰。有人可以幫我解決這個問題嗎?Android將圖像添加到應用程序,使其緩慢

代碼:

public class MainActivity extends Activity { 

private final int SELECT_FILE = 1; 
private final int REQUEST_CAMERA = 0; 
private ImageButton btnImg; 

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

    btnImg = (ImageButton) findViewById(R.id.btnAddThumbnail); 

    btnImg.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      selectImage(); 
     } 
    }); 
} 

private void selectImage() { 
    final CharSequence[] items = { "Take Photo", "Choose from gallery", 
      "Cancel" }; 

    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
    builder.setTitle("Add Photo!"); 

    builder.setItems(items, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int item) { 
      if (items[item].equals("Take Photo")) { 
       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       File f = new File(android.os.Environment.getExternalStorageDirectory(), "temp.jpg"); 
       intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); 
       startActivityForResult(intent, REQUEST_CAMERA); 
      } 

      else if (items[item].equals("Choose from gallery")) { 
       Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       intent.setType("image/*"); 
       startActivityForResult(Intent.createChooser(intent, "Select File"), SELECT_FILE); 
      } 

      else if (items[item].equals("Cancel")) { 
       dialog.dismiss(); 
      } 
     } 
    }); 
    builder.show(); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK) { 
     if (requestCode == REQUEST_CAMERA) { 
      File f = new File(Environment.getExternalStorageDirectory().toString()); 
      for (File temp : f.listFiles()) { 
       if (temp.getName().equals("temp.jpg")) { 
        f = temp; 
        break; 
       } 
      } 
      try { 
       Bitmap bm; 
       BitmapFactory.Options btmapOptions = new BitmapFactory.Options(); 

       bm = BitmapFactory.decodeFile(f.getAbsolutePath(),btmapOptions); 

       // bm = Bitmap.createScaledBitmap(bm, 70, 70, true); 
       btnImg.setImageBitmap(bm); 
       btnImg.setScaleType(ScaleType.CENTER_INSIDE); 

       String path = android.os.Environment.getExternalStorageDirectory() + File.separator + "Phoenix" + File.separator + "default"; 
       f.delete(); 
       OutputStream fOut = null; 
       File file = new File(path, String.valueOf(System.currentTimeMillis()) + ".jpg"); 
       try { 
        fOut = new FileOutputStream(file); 
        bm.compress(Bitmap.CompressFormat.JPEG, 85, fOut); 
        fOut.flush(); 
        fOut.close(); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } else if (requestCode == SELECT_FILE) { 
      Uri selectedImageUri = data.getData(); 

      String tempPath = getPath(selectedImageUri, MainActivity.this); 
      Bitmap bm; 
      BitmapFactory.Options btmapOptions = new BitmapFactory.Options(); 
      bm = BitmapFactory.decodeFile(tempPath, btmapOptions); 
      btnImg.setImageBitmap(bm); 
      btnImg.setScaleType(ScaleType.CENTER_INSIDE); 
     } 
    } 
} 

public String getPath(Uri uri, Activity activity) { 
    String[] projection = { MediaColumns.DATA }; 
    Cursor cursor = activity.managedQuery(uri, projection, null, null, null); 
    int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
} 

}碰撞後

錯誤:

05-04 20:45:02.890:W/dalvikvm(22576):線程ID = 1:螺紋以未捕獲的異常退出(組= 0x41d9f2a0) 05-04 20:45:02.895:E/AndroidRuntime(22576):致命異常:主要 05-04 20:45:02.895:E/AndroidRuntime(22576):java.lang .OutOfMemoryError 05-04 20:45:02.895:E/AndroidRuntime(22576):at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 05-04 20:45:02.895:E/AndroidRuntime(22576):at android.graphics .BitmapFactory.decodeStream(BitmapFactory.java:650) 05-04 20:45:02.895:E/AndroidRuntime(22576):at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:389) 05-04 20:45 :02.895:E/AndroidRuntime(22576):at com.example.spui.MainActivity.onActivityResult(MainActivity.java:95) 05-04 20:45:02.895:E/AndroidRuntime(22576):at android.app.Activity .dispatchActivityResult(Activity.java:5390) 05-04 20:45:02.895:E/AndroidRuntime(22576):at android.app.ActivityThread.deliverResults(ActivityThread.java:3178) 05-04 20:45:02.895 :E/AndroidRuntime(22576):在android.app.ActivityThread.handleSendResult(ActivityTh read.java:3225) 05-04 20:45:02.895:E/AndroidRuntime(22576):at android.app.ActivityThread.access $ 1100(ActivityThread.java:140) 05-04 20:45:02.895:E/AndroidRuntime(22576):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1275) 05-04 20:45:02.895:E/AndroidRuntime(22576):at android.os.Handler.dispatchMessage(Handler .java:99) 05-04 20:45:02.895:E/AndroidRuntime(22576):at android.os.Looper.loop(Looper.java:137) 05-04 20:45:02.895:E/AndroidRuntime (22576):at android.app.ActivityThread.main(ActivityThread.java:4898) 05-04 20:45:02.895:E/AndroidRuntime(22576):at java.lang.reflect.Method.invokeNative(Native Method) 05-04 20:45:02.895:E/AndroidRuntime(22576):at java.lang.reflect.Method.invoke(Method.java:511) 05-04 2 0:45:02.895:E/AndroidRuntime(22576):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1006) 05-04 20:45:02.895:E/AndroidRuntime(22576) :at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 05-04 20:45:02.895:E/AndroidRuntime(22576):at dalvik.system.NativeStart.main(Native Method)

回答

2

機會是圖像太大,你的內存不足。某些設備會以較大尺寸的相當大的圖像尺寸記錄圖像,這又會導致您遇到內存問題。處理從網絡下載的圖像時會發生同樣的情況。

我會使用API​​方法Bitmap.createScaledBitmap縮放位圖,以便在設置它之前縮放位圖。

有一個很好的SO寄出對這段這裏Android: Resize a large bitmap file to scaled output file

我還想補充一點,得益於一個偉大的圖書館AndroidQuery,你可以讓你的生活變得更簡單!我在下面添加了一些代碼,以顯示它如何與你的代碼片段一起工作。這裏有http://blog.androidquery.com/2011/05/down-sample-images-to-avoid-out-of.html

File file = new File(Environment.getExternalStorageDirectory().toString());  
//load image from file, down sample to target width of 300 pixels and set it to the Imageview 
aq.id(R.id.avatar).image(file, 300); 
+0

現在要閱讀完整的博客文章,將讓你知道,如果它是成功的 – mXX 2013-05-04 20:02:39

+1

結帳AndroidQuery後,這是很容易使用。 – 2013-05-04 20:05:27

相關問題