简体   繁体   English

图像背景问题android

[英]Image background issue android

i'm working on app, that reads image from gallery, and becomes background in layout, i've used the following code but it gives me force close error as soon as i click the picture, here is the code 我正在开发应用程序,该应用程序从图库中读取图像,并在布局中成为背景,我使用了以下代码,但是一旦单击图片,它就会给我强制关闭错误,这是代码

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

and

@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 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>

Here is my error log 这是我的错误日志

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

It loads the image successfully and set as background, but crashes when i tried to load larger images ie 8mpx camera image etc. I managed to solve that by the following code: 它成功加载了图像并将其设置为背景,但是当我尝试加载较大的图像(例如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());
                }
            }
        }
    }

That worked perfectly fine for all images. 对于所有图像来说,效果都很好。 Hope it would help someone! 希望对别人有帮助!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM