0

我正在开发应用程序,它从图库中读取图像,并成为布局中的背景,我使用了以下代码,但是一旦我单击图片,它就会给我强制关闭错误,这是代码

 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();
            }
        }
        }
    }

主要的.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
4

1 回答 1

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());
                }
            }
        }
    }

这对所有图像都非常有效。希望它会帮助别人!

于 2012-08-23T14:16:47.713 回答