【问题标题】:KitKat ANR when accessing empty contact photo访问空联系人照片时的 KitKat ANR
【发布时间】:2013-11-28 11:27:17
【问题描述】:

对于我的应用,我从 ContactsContract API 中读取了联系人的照片,该 API 在 Android KitKat 之前运行良好。我在 4.4 更改日志中找不到有关 ContactsContract.Contacts.openContactPhotoInputStream() 方法更改的任何具体内容,但我只能在 KitKat 上复制此内容,并且该联系人没有照片。

我使用这个从联系人中读取:

public static Bitmap getContactPhoto(final Uri lookupUri, final Context context, boolean preferHighRes) 
        throws IOException, OutOfMemoryError, NullPointerException{
    InputStream photo_stream = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), 
            lookupUri, preferHighRes);
    BufferedInputStream input = new BufferedInputStream(photo_stream);
    Bitmap contactImg = BitmapFactory.decodeStream(input);
    input.close();
    return contactImg;
}

这个方法是这样调用的:

private class retrieveContactPhoto extends AsyncTask<Void, Void, Bitmap> {

    Uri contactUri;
    ImageView imageView;

    public retrieveContactPhoto(Uri contactUri, ImageView iView){
        this.contactUri = contactUri;
        this.imageView = iView;
    }

    @Override
    protected void onPreExecute(){
        imageView.setImageResource(R.drawable.friend_image_default);
    }

    @Override
    protected Bitmap doInBackground(Void... params) {
        Bitmap image;
        try {
            image = ContactLookup.getContactPhoto(contactUri, mContext, true);
        } catch (Exception e) {
            image = null;
        }
        return image;
    }

    @Override
    protected void onPostExecute(Bitmap image) {
        if(image!=null){
            imageView.setImageBitmap(image);
        }
    }
}

这将工作几秒钟,但在那之后我会在 LogCat 中得到很多悲伤(通常超过 50 万行错误!?)

11-28 11:05:03.067: W/System.err(9507): java.io.IOException: BufferedInputStream is closed
11-28 11:05:03.077: W/System.err(9507):     at java.io.BufferedInputStream.streamClosed(BufferedInputStream.java:118)
11-28 11:05:03.087: W/System.err(9507):     at java.io.BufferedInputStream.read(BufferedInputStream.java:279)
11-28 11:05:03.097: W/System.err(9507):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
11-28 11:05:03.097: W/System.err(9507):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:719)
11-28 11:05:03.097: W/System.err(9507):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:791)
11-28 11:05:03.097: W/System.err(9507):     at com.repay.android.addDebt.ContactLookup.getContactPhoto(ContactLookup.java:31)
11-28 11:05:03.097: W/System.err(9507):     at com.repay.android.StartFragmentAdapter$retrieveContactPhoto.doInBackground(StartFragmentAdapter.java:110)
11-28 11:05:03.097: W/System.err(9507):     at com.repay.android.StartFragmentAdapter$retrieveContactPhoto.doInBackground(StartFragmentAdapter.java:1)
11-28 11:05:03.097: W/System.err(9507):     at android.os.AsyncTask$2.call(AsyncTask.java:264)
11-28 11:05:03.107: W/System.err(9507):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
11-28 11:05:03.107: W/System.err(9507):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-28 11:05:03.107: W/System.err(9507):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
11-28 11:05:03.117: W/System.err(9507):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
11-28 11:05:03.117: W/System.err(9507):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
11-28 11:05:03.117: W/System.err(9507):     at java.lang.Thread.run(Thread.java:864)

我不知道为什么它现在说要关闭流,因为这在任何其他版本的 Android 上都不会发生。此外,如果它不在工作线程中,仍然会出现此错误。

【问题讨论】:

  • 您找到解决方案了吗?我有类似的问题
  • 也有类似的问题。 ANR 在 4.4 中访问联系人照片

标签: java android contactscontract


【解决方案1】:

如果没有设置联系人和照片,那么您必须使用联系人的默认照片,您可以通过此路径找到该照片:

\android-sdk\platforms\android-v#\data\res\drawable-\ic_contact_picture.‌​png

【讨论】:

    【解决方案2】:

    您可以尝试对您的代码进行一些小改动吗?我有一个类似的问题 - 我的应用程序只是停留在无限循环中。

    试试这个:

    InputStream photo_stream = ContactsContract.Contacts.openContactPhotoInputStream((ContentResolver) getContentResolver().query(ContactData, null, null, null, null),lookupUri, preferHighRes);
    

    这对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 2014-01-14
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多