Search code examples
androidandroid-contactsandroid-image

android image loading java.io.IOException: BufferedInputStream is closed


hi am getting contact image fetching in my application then application is running but am getting error in cat log like this. how to resolve this problem ..see the below codehelp me

at java.io.BufferedInputStream.streamClosed(BufferedInputStream.java:118) at java.io.BufferedInputStream.read(BufferedInputStream.java:279)

 loading image
    --------------------

    private Bitmap getContactImage(String mNumber) {

            Bitmap cPhoto = null;
            BufferedInputStream buf_stream = null;

            Cursor cursorPhoto = getActivity().getContentResolver().query(
                    Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
                            Uri.decode(mNumber)), new String[] { PhoneLookup._ID },
                    null, null, null);
            InputStream photo_stream = null;
            if (cursorPhoto.moveToFirst()) {
                String contactId = cursorPhoto.getString(0);
                Uri contactPhotoUri = ContentUris.withAppendedId(
                        ContactsContract.Contacts.CONTENT_URI,
                        Long.parseLong(contactId));

                try {
                    photo_stream = ContactsContract.Contacts
                            .openContactPhotoInputStream(getActivity()
                                    .getContentResolver(), contactPhotoUri);

                    buf_stream = new BufferedInputStream(photo_stream);

                    cPhoto = BitmapFactory.decodeStream(buf_stream);


                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (buf_stream != null && photo_stream != null) {
                        try {
                            buf_stream.close();
                            photo_stream.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }



 error in cat log
------------------------


 GC_CONCURRENT freed 183K, 4% free 7135K/7431K, paused 8ms+8ms
05-31 10:08:51.518: W/System.err(968): java.io.IOException: BufferedInputStream is closed
05-31 10:08:51.538: W/System.err(968):  at java.io.BufferedInputStream.streamClosed(BufferedInputStream.java:118)
05-31 10:08:51.549: W/System.err(968):  at java.io.BufferedInputStream.read(BufferedInputStream.java:279)
05-31 10:08:51.569: W/System.err(968):  at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
05-31 10:08:51.569: W/System.err(968):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:493)
05-31 10:08:51.569: W/System.err(968):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:549)
05-31 10:08:51.569: W/System.err(968):  at com.example.demologs.CallLogsFragment.getContactImage(CallLogsFragment.java:195)
05-31 10:08:51.589: W/System.err(968):  at com.example.demologs.CallLogsFragment.readCallLogs(CallLogsFragment.java:126)
05-31 10:08:51.589: W/System.err(968):  at com.example.demologs.CallLogsFragment.onStart(CallLogsFragment.java:53)
05-31 10:08:51.599: W/System.err(968):  at android.support.v4.app.Fragment.performStart(Fragment.java:1484)
05-31 10:08:51.610: W/System.err(968):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:941)
05-31 10:08:51.618: W/System.err(968):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
05-31 10:08:51.618: W/System.err(968):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070)
05-31 10:08:51.629: W/System.err(968):  at android.support.v4.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1866)
05-31 10:08:51.638: W/System.err(968):  at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:568)
05-31 10:08:51.638: W/System.err(968):  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1133)
05-31 10:08:51.649: W/System.err(968):  at android.app.Activity.performStart(Activity.java:4475)
05-31 10:08:51.649: W/System.err(968):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1928)
05-31 10:08:51.668: W/System.err(968):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
05-31 10:08:51.668: W/System.err(968):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
05-31 10:08:51.698: W/System.err(968):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
05-31 10:08:51.708: W/System.err(968):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-31 10:08:51.708: W/System.err(968):  at android.os.Looper.loop(Looper.java:137)
05-31 10:08:51.708: W/System.err(968):  at android.app.ActivityThread.main(ActivityThread.java:4340)
05-31 10:08:51.719: W/System.err(968):  at java.lang.reflect.Method.invokeNative(Native Method)
05-31 10:08:51.719: W/System.err(968):  at java.lang.reflect.Method.invoke(Method.java:511)
05-31 10:08:51.738: W/System.err(968):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-31 10:08:51.738: W/System.err(968):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-31 10:08:51.748: W/System.err(968):  at dalvik.system.NativeStart.main(Native Method)

Solution

  • If photo is not present on the contact then the InputStream returned is null. You should check if photo_stream is null, before trying to decode the image.

    try {
            photo_stream = ContactsContract.Contacts
                    .openContactPhotoInputStream(getActivity()
                            .getContentResolver(), contactPhotoUri);
    
            if(photo_stream != null) {
            buf_stream = new BufferedInputStream(photo_stream);
    
            cPhoto = BitmapFactory.decodeStream(buf_stream);
        }
    
        } catch (Exception e) {
            e.printStackTrace();
            }
    

    Also look at How do I load a contact Photo?