2012-05-16 6 views
0

Я работаю над приложением, которое читает изображение из галереи и становится фоном в макете, я использовал следующий код, но он дает мне силу закрыть ошибку, как только я нажимаю изображение, вот кодПроблема с изображением фона android

Intent intent = new Intent(); 
    intent.setType("image/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    startActivityForResult(Intent.createChooser(intent, "Select Picture"),0); 

и

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

     { 
      super.onActivityResult(requestCode, resultCode, data); 

     if(resultCode == Activity.RESULT_OK && requestCode == 0) { 
      Uri photo = imageUri; 
      ContentResolver resolver = getContentResolver(); 
      resolver.notifyChange(photo, null); 

      try {     
       Bitmap bitmap = MediaStore.Images.Media.getBitmap(resolver, photo); 
       RelativeLayout bg = (RelativeLayout) findViewById(R.id.bg); 
       Drawable drawable = new BitmapDrawable(getResources(), bitmap); 
       bg.setBackgroundDrawable(drawable); 

      //Do something useful with your bitmap 
       } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
       } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     } 
    } 

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <RelativeLayout 
     android:id="@+id/bg" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.92" 
     android:orientation="vertical" > 

     <LinearLayout 
      android:id="@+id/linearLayout2" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.88" 
      android:orientation="vertical" > 

     </LinearLayout> 
    </RelativeLayout> 

    <Button 
     android:id="@+id/button" 
     android:layout_width="143dp" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:text="Save" /> 

</LinearLayout> 

Вот мой журнал ошибок

05-16 20:20:23.768: W/dalvikvm(288): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
05-16 20:20:24.098: E/AndroidRuntime(288): FATAL EXCEPTION: main 
05-16 20:20:24.098: E/AndroidRuntime(288): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { dat=content://media/external/images/media/1 }} to activity {org.example.touch/org.example.touch.Touch}: java.lang.NullPointerException 
05-16 20:20:24.098: E/AndroidRuntime(288): at android.app.ActivityThread.deliverResults(ActivityThread.java:3515) 
05-16 20:20:24.098: E/AndroidRuntime(288): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557) 
05-16 20:20:24.098: E/AndroidRuntime(288): at android.app.ActivityThread.access$2800(ActivityThread.java:125) 
05-16 20:20:24.098: E/AndroidRuntime(288): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063) 
05-16 20:20:24.098: E/AndroidRuntime(288): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-16 20:20:24.098: E/AndroidRuntime(288): at android.os.Looper.loop(Looper.java:123) 
05-16 20:20:24.098: E/AndroidRuntime(288): at android.app.ActivityThread.main(ActivityThread.java:4627) 
05-16 20:20:24.098: E/AndroidRuntime(288): at java.lang.reflect.Method.invokeNative(Native Method) 
05-16 20:20:24.098: E/AndroidRuntime(288): at java.lang.reflect.Method.invoke(Method.java:521) 
05-16 20:20:24.098: E/AndroidRuntime(288): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
05-16 20:20:24.098: E/AndroidRuntime(288): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
05-16 20:20:24.098: E/AndroidRuntime(288): at dalvik.system.NativeStart.main(Native Method) 
05-16 20:20:24.098: E/AndroidRuntime(288): Caused by: java.lang.NullPointerException 
05-16 20:20:24.098: E/AndroidRuntime(288): at android.os.Parcel.readException(Parcel.java:1253) 
05-16 20:20:24.098: E/AndroidRuntime(288): at android.os.Parcel.readException(Parcel.java:1235) 
05-16 20:20:24.098: E/AndroidRuntime(288): at android.content.IContentService$Stub$Proxy.notifyChange(IContentService.java:458) 
05-16 20:20:24.098: E/AndroidRuntime(288): at android.content.ContentResolver.notifyChange(ContentResolver.java:850) 
05-16 20:20:24.098: E/AndroidRuntime(288): at android.content.ContentResolver.notifyChange(ContentResolver.java:836) 
05-16 20:20:24.098: E/AndroidRuntime(288): at org.example.touch.Touch.onActivityResult(Touch.java:117) 
05-16 20:20:24.098: E/AndroidRuntime(288): at android.app.Activity.dispatchActivityResult(Activity.java:3890) 
05-16 20:20:24.098: E/AndroidRuntime(288): at android.app.ActivityThread.deliverResults(ActivityThread.java:3511) 
05-16 20:20:24.098: E/AndroidRuntime(288): ... 11 more 
+0

сообщение об ошибке журнал – Krish

+0

Я думаю, вы получаете OutOfMemory ошибки –

+0

@Krish найти отредактированный анс, Я приложил мой журнал ошибок с ним – Numair

ответ

0

Он загружает файл успешно и установить в качестве фона, но падает, когда я пытался загрузить большие изображения, то есть 8mpx изображение камеры и т.д. мне удалось решить, что с помощью следующего кода:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

     { 
      super.onActivityResult(requestCode, resultCode, data); 

      if (resultCode == Activity.RESULT_OK && requestCode == 0) { 
       Uri photo = data.getData(); 
       ContentResolver resolver = getContentResolver(); 
       resolver.notifyChange(photo, null); 

       Display currentDisplay = getWindowManager().getDefaultDisplay(); 
       int dw = currentDisplay.getWidth(); 
       int dh = currentDisplay.getHeight()/2 - 100; 
       try { 
        // Load up the image's dimensions not the image itself 
        BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); 
        bmpFactoryOptions.inJustDecodeBounds = true; 
        Bitmap bmp = BitmapFactory.decodeStream(
          getContentResolver().openInputStream(photo), null, 
          bmpFactoryOptions); 
        int heightRatio = (int) Math 
          .ceil(bmpFactoryOptions.outHeight/(float) dh); 
        int widthRatio = (int) Math.ceil(bmpFactoryOptions.outWidth 
          /(float) dw); 
        if (heightRatio > 1 && widthRatio > 1) { 
         if (heightRatio > widthRatio) { 
          bmpFactoryOptions.inSampleSize = heightRatio; 
         } else { 
          bmpFactoryOptions.inSampleSize = widthRatio; 
         } 
        } 
        bmpFactoryOptions.inJustDecodeBounds = false; 
        FrameLayout bg = (FrameLayout) findViewById(R.id.frame); 
        bmp = BitmapFactory.decodeStream(getContentResolver() 
          .openInputStream(photo), null, bmpFactoryOptions); 
        // bg.setImageBitmap(bmp); 
        Drawable drawable = new BitmapDrawable(getResources(), bmp); 
        bg.setBackgroundDrawable(drawable); 
       } catch (FileNotFoundException e) { 
        Log.v("ERROR", e.toString()); 
       } 
      } 
     } 
    } 

Это отлично работал для всех изображений. Надеюсь, это поможет кому-то!

Смежные вопросы