【问题标题】:Getting nullPointerException with contentprovideroperation使用 contentprovideroperation 获取 nullPointerException
【发布时间】:2013-04-29 01:04:20
【问题描述】:

我正在尝试通过代码更新 android 中的联系人照片。使用内容提供者操作我尝试更新照片。在代码 sn-p 中添加了更新查询。但什么也没有发生。我的代码 sn-p 如下。

   @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 1 && data != null)

    {

        Uri contactData = data.getData();

        String[] projection = new String[] { Data.RAW_CONTACT_ID,
                Photo.PHOTO };

        Cursor c = getContentResolver().query(Data.CONTENT_URI, projection,
                null, null, null);

        if (c.moveToFirst()) {

            String dataid = c.getString(c
                    .getColumnIndex(Data.RAW_CONTACT_ID));
            String first = String.valueOf(dataid);

            byte[] dataid1 = c.getBlob(c.getColumnIndex(Photo.PHOTO));
            String first1 = String.valueOf(dataid1);
            System.out.println("fisttry");
            System.out.println(dataid);
            System.out.println(first);
            System.out.println(first1);
            System.out.println(dataid1);

            try {

                System.out.println("fisttry");
                ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

                ContentProviderOperation.Builder op = ContentProviderOperation
                        .newUpdate(ContactsContract.Data.CONTENT_URI);

                op.withSelection(
                        ContactsContract.Data.RAW_CONTACT_ID + "=?"
                                + " AND " + ContactsContract.Data.MIMETYPE
                                + "=?",
                        new String[] {
                                String.valueOf(dataid),
                                ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE });
                op.withValue(
                        ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
                op.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO,
                        photo);

                ops.add(op.build());
                System.out.println(op);
                System.out.println(ops);
            } catch (Exception e) {
                e.printStackTrace();
            }

            // Update

            try {
                this.getContentResolver().applyBatch(
                        ContactsContract.AUTHORITY, ops);
                System.out.println("secondtry");
            } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (OperationApplicationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }
    }



}

堆栈跟踪:

01-12 01:19:22.202: E/AndroidRuntime(16057): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.contacts/contacts/lookup/0r69-303A36303A365A/71 (has extras) }} to activity {com.ileaf.camerafun/com.ileaf.camerafun.TrialActivity}: java.lang.NullPointerException
01-12 01:19:22.202: E/AndroidRuntime(16057):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3521)
01-12 01:19:22.202: E/AndroidRuntime(16057):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3563)
01-12 01:19:22.202: E/AndroidRuntime(16057):    at android.app.ActivityThread.access$2800(ActivityThread.java:126)
01-12 01:19:22.202: E/AndroidRuntime(16057):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2068)
01-12 01:19:22.202: E/AndroidRuntime(16057):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-12 01:19:22.202: E/AndroidRuntime(16057):    at android.os.Looper.loop(Looper.java:123)
01-12 01:19:22.202: E/AndroidRuntime(16057):    at android.app.ActivityThread.main(ActivityThread.java:4633)
01-12 01:19:22.202: E/AndroidRuntime(16057):    at java.lang.reflect.Method.invokeNative(Native Method)
01-12 01:19:22.202: E/AndroidRuntime(16057):    at java.lang.reflect.Method.invoke(Method.java:521)
01-12 01:19:22.202: E/AndroidRuntime(16057):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
01-12 01:19:22.202: E/AndroidRuntime(16057):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-12 01:19:22.202: E/AndroidRuntime(16057):    at dalvik.system.NativeStart.main(Native Method)
01-12 01:19:22.202: E/AndroidRuntime(16057): Caused by: java.lang.NullPointerException
01-12 01:19:22.202: E/AndroidRuntime(16057):    at android.content.ContentProviderProxy.applyBatch(ContentProviderNative.java:454)
01-12 01:19:22.202: E/AndroidRuntime(16057):    at android.content.ContentProviderClient.applyBatch(ContentProviderClient.java:95)
01-12 01:19:22.202: E/AndroidRuntime(16057):    at android.content.ContentResolver.applyBatch(ContentResolver.java:622)
01-12 01:19:22.202: E/AndroidRuntime(16057):    at com.ileaf.camerafun.TrialActivity.onActivityResult(TrialActivity.java:513)
01-12 01:19:22.202: E/AndroidRuntime(16057):    at android.app.Activity.dispatchActivityResult(Activity.java:3890)
01-12 01:19:22.202: E/AndroidRuntime(16057):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3517)
01-12 01:19:22.202: E/AndroidRuntime(16057):    ... 11 more

【问题讨论】:

  • 现在:“发布堆栈跟踪”。
  • 请向我们展示 513 of TrialActivity
  • 我建议你修改你的代码。对于 Data.CONTENT_URI 中的所有条目,您正在执行大量的 applyBatch 调用。
  • 实现方法时为什么要保留“// TODO 自动生成的方法存根”?

标签: android


【解决方案1】:

这是一个活动生命周期问题。当您调用 startActivityForResult() 时,启动的 Activity 会暂停,如果 Android 资源不足,可能会被完全销毁。

当您从启动的活动返回时,对 onActivityResult() 的调用发生在活动生命周期的早期 - 例如,如果活动在片段中调用 onActivityResult() 内的“getActivity()”,将返回 null实际销毁,但如果未销毁则返回非空值。

因此,您无法在 onActivityResult() 方法中可靠地执行任何复杂的操作。我在这里使用了两种模式。第一种是只使用onActivityResult() 将响应存储在实例变量中,然后在onResume() 方法中执行操作;二是有条件地执行代码:

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

    super.onActivityResult(requestCode, resultCode, data);

    if (getActivity() != null) {
        // as we have an activity, it wasn't destroyed, and we can do stuff here
    }


}

您使用哪种解决方案取决于您处理的场景。当通过数据意图返回瞬态数据时,我使用第一个解决方案(因为这是我得到它的唯一方法),而当调用 onActivityResult() 只是通知我应该从存储的数据中刷新视图时,我使用第二个解决方案其他地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 2012-10-24
    相关资源
    最近更新 更多