2011-11-23 20 views
5

Bu konuyla ilgili dün gece bir soru yayınladım, ancak doğru yardımı alabilmek için yeterince açıkladığımı düşünmüyorum. Temel olarak, galerinizden bir görüntü seçmenizi ve uygulamada görüntülediğim bir ImageView'da göstermenizi sağlayan bir düğmeye basabileceğiniz bir uygulama var. Her şey harika çalışıyor. Ancak, düğmeye tekrar basıp farklı bir resim seçtiğimde uygulama kuvveti kapanıyor.dışsal ayırma çok büyük

UPDATE Şimdi, galerideki indirilenler fotoğraf klasörümden bir fotoğraf çektiğimde, iyi çalışıyorsa, fotoğrafları istediğim sıklıkta değiştirebilirim. Ama fotoğrafını değiştirmek için kamera fotoğraf klasörüne geri döndüğümde güç kapanıyor.

UPDATE 2 Ayrıca, Galeri uygulamamdaki diğer herhangi bir klasörle de iyi çalışıyor. Bu problemi (tek tek) bu sorundan sadece biri, bu işlem için çok büyük olan "Kamera" Klasörü

UPDATE 3 19660800 baytlık harici ayırma üzerindedir. soruna neden oluyor. Seçilen fotoğrafların boyutunu azaltmanın herhangi bir yolu var mı?

 private static final int SELECT_PICTURE = 1; 

     private String selectedImagePath; 
     private ImageView img; 

     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

      img = (ImageView)findViewById(R.id.myimageview); 

      ((Button) findViewById(R.id.taptoadd)) 
        .setOnClickListener(new OnClickListener() { 
         public void onClick(View arg0) { 
          Intent intent = new Intent(); 
          intent.setType("image/*"); 
          intent.setAction(Intent.ACTION_GET_CONTENT); 
          startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE); 
         } 
        }); 
     } 

     public void onActivityResult(int requestCode, int resultCode, Intent data) { 
      if (resultCode == RESULT_OK) { 
       if (requestCode == SELECT_PICTURE) { 
        Uri selectedImageUri = data.getData(); 
        selectedImagePath = getPath(selectedImageUri); 
        System.out.println("Image Path : " + selectedImagePath); 
        img.setImageURI(selectedImageUri); 
       } 
     } 
     } 

     public String getPath(Uri uri) { 
     String[] projection = { MediaStore.Images.Media.DATA }; 

      Cursor cursor = managedQuery(uri, projection, null, null, null); 
      int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
      cursor.moveToFirst(); 
      return cursor.getString(column_index); 


     } 

burada günlüğünü

   11-23 16:33:15.871: D/dalvikvm(9171): GC_EXTERNAL_ALLOC freed 51K, 49% free 2793K/5447K, external 20868K/22916K, paused 50ms 
    11-23 16:33:15.878: E/dalvikvm-heap(9171): 19660800-byte external allocation too large for this process. 
    11-23 16:33:15.886: E/GraphicsJNI(9171): VM won't let us allocate 19660800 bytes 
    11-23 16:33:15.906: D/dalvikvm(9171): GC_FOR_MALLOC freed <1K, 49% free 2792K/5447K, external 1668K/20868K, paused 18ms 
    11-23 16:33:15.906: D/skia(9171): --- decoder->decode returned false 
    11-23 16:33:15.906: D/AndroidRuntime(9171): Shutting down VM 
    11-23 16:33:15.910: W/dalvikvm(9171): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
    11-23 16:33:15.937: E/AndroidRuntime(9171): FATAL EXCEPTION: main 
    11-23 16:33:15.937: E/AndroidRuntime(9171): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:470) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.graphics.drawable.Drawable.createFromStream(Drawable.java:657) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.widget.ImageView.resolveUri(ImageView.java:521) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.widget.ImageView.setImageURI(ImageView.java:305) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at snapshot.app.LinearLayoutsActivity.onActivityResult(LinearLayoutsActivity.java:48) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.app.Activity.dispatchActivityResult(Activity.java:3908) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2528) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:2574) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.app.ActivityThread.access$2000(ActivityThread.java:117) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:961) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.os.Handler.dispatchMessage(Handler.java:99) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.os.Looper.loop(Looper.java:130) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at java.lang.reflect.Method.invokeNative(Native Method) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at java.lang.reflect.Method.invoke(Method.java:507) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at dalvik.system.NativeStart.main(Native Method) 
+1

gönderebilir misiniz? – slayton

+0

Günlüğü ekledim. "Kamera" klasöründeki fotoğrafları değiştirirken sadece uygulama kuvveti kapanıyor, diğer tüm klasörler iyi çalışıyor. – dabious

+0

Kamera klasöründeki resimler çok büyük ve bir OOM hatasına neden oluyor gibi görünüyor. Android'in bir uygulama için yalnızca 16mb yığını var. – blessenm

cevap

5

Yüklediğiniz Bitmap çok büyük araçları alıyorsanız hatadır. Onu daha da küçültmelisin. Strange out of memory issue while loading an image to a Bitmap object

Güncelleme: Bu nasıl başa üzerinde bazı büyük örnekler için bu soruya bakın Yerine URI Bitmap olarak yüklemek için ImageView söylemek yerine, önce kendini bitmap yüklemek ve daha sonra da bu bit eşlem ayarlamanız gerekir ImageView'deki görüntü. Bu oldukça basit.

:

sonra da birlikte bitmap yükleyebilirsiniz ilk görüntüye yolunu içeren bir dize (Ben emin değilim ancak sen URI.getPath() kullanabilirsiniz düşünüyorum) için URI dönüştürmek gerekir senden bir bit eşlem yüklemek için
Bitmap b = BitmapFactory.decodeFile(pathToImage); 

Bu, tüm bitmap'in kodunu çözecektir, bunun yerine bitmap'i istenen çözünürlüğe küçültmek istiyorsunuz. Görüntü resminizin 125x125 piksel olacağını ve görüntünüzün 1000x1000 piksel olduğunu söyleyelim. 125/1000 = 8 böylece her 8 nolu pikselin kodunu çözmemiz gerekiyor. Bunu yapmak için aşağıdakileri yaparız:

int inSample = 8; 

opts = new BitmapFactory.Options(); 
opts.inSampleSize = inSample; 

Bitmap b = BitmapFactory.decodeFile(pathToImage, opts); // this bitmap will be 1/8 the size of the original 

Onun oldukça düz ileri ve bellek sorunları çözmeniz gerekir. Daha kapsamlı bir açıklama için bu soruya verdiğim yanıtın 2. kısmına bakınız: Android GalleryView Recycling. Uygulama gücü kapandığında Logcat çıktısını

+0

Yapamam, hayatım boyunca, bu işe yaramaz. :/(Kabul - Ben tüm bunlar için çok yeni. Açıkçası.) – dabious

+0

@dabious Güncellememi görün – slayton

+0

Awesome! Teşekkür ederim. – dabious

İlgili konular