掌握contentprovideroperation NullPointerException异常 [英] Getting nullPointerException with contentprovideroperation

查看:223
本文介绍了掌握contentprovideroperation NullPointerException异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图更新通过code在Android中的联系人照片。使用内容提供商操作我试图更新的照片。更新查询在code段补充说。但没有任何反应。我的code片断如下。

  @覆盖
保护无效的onActivityResult(INT申请code,INT结果code,意图数据){
    // TODO自动生成方法存根
    super.onActivityResult(要求code,结果code,数据);    如果(要求code == 1安培;&放大器;数据!= NULL)    {        乌里联络资料= data.getData();        的String [] =投影新的String [] {Data.RAW_CONTACT_ID,
                Photo.PHOTO};        光标C = getContentResolver()查询(Data.CONTENT_URI,投影,
                NULL,NULL,NULL);        如果(c.moveToFirst()){            字符串数据ID = c.getString(C
                    .getColumnIndex(Data.RAW_CONTACT_ID));
            第一串=将String.valueOf(数据ID);            字节[] = dataid1 c.getBlob(c.getColumnIndex(Photo.PHOTO));
            字符串first1 =将String.valueOf(dataid1);
            的System.out.println(fisttry);
            的System.out.println(数据ID);
            的System.out.println(第一);
            的System.out.println(first1);
            的System.out.println(dataid1);            尝试{                的System.out.println(fisttry);
                ArrayList的< ContentProviderOperation> OPS =新的ArrayList< ContentProviderOperation>();                ContentProviderOperation.Builder OP = ContentProviderOperation
                        .newUpdate(ContactsContract.Data.CONTENT_URI);                op.withSelection(
                        ContactsContract.Data.RAW_CONTACT_ID +=?
                                +和+ ContactsContract.Data.MIMETYPE
                                +=?,
                        新的String [] {
                                将String.valueOf(数据ID)
                                ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE});
                op.withValue(
                        ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
                op.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO,
                        照片);                ops.add(op.build());
                的System.out.println(OP);
                的System.out.println(OPS);
            }赶上(例外五){
                e.printStackTrace();
            }            //更新            尝试{
                this.getContentResolver()。applyBatch(
                        ContactsContract.AUTHORITY,OPS);
                的System.out.println(secondtry);
            }赶上(RemoteException的E){
                // TODO自动生成catch块
                e.printStackTrace();
            }赶上(OperationApplicationException E){
                // TODO自动生成catch块
                e.printStackTrace();
            }
        }
    }}

堆栈跟踪:

  1月1日至12日:19:22.202:E / AndroidRuntime(16057):了java.lang.RuntimeException:不提供结果ResultInfo {谁= NULL,请求= 1,结果=  - 1,数据= {意向DAT =内容://com.android.contacts/contacts/lookup/0r69-303A36303A365A/71(有临时演员)}}到活动{com.ileaf.camerafun / com.ileaf.camerafun.TrialActivity} :显示java.lang.NullPointerException
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在android.app.ActivityThread.deliverResults(ActivityThread.java:3521)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在android.app.ActivityThread.handleSendResult(ActivityThread.java:3563)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在android.app.ActivityThread.access $ 2800(ActivityThread.java:126)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2068)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在android.os.Handler.dispatchMessage(Handler.java:99)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在android.os.Looper.loop(Looper.java:123)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在android.app.ActivityThread.main(ActivityThread.java:4633)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在java.lang.reflect.Method.invokeNative(本机方法)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在java.lang.reflect.Method.invoke(Method.java:521)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:858)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在dalvik.system.NativeStart.main(本机方法)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):致:显示java.lang.NullPointerException
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在android.content.ContentProviderProxy.applyBatch(ContentProviderNative.java:454)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在android.content.ContentProviderClient.applyBatch(ContentProviderClient.java:95)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在android.content.ContentResolver.applyBatch(ContentResolver.java:622)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在com.ileaf.camerafun.TrialActivity.onActivityResult(TrialActivity.java:513)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在android.app.Activity.dispatchActivityResult(Activity.java:3890)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):在android.app.ActivityThread.deliverResults(ActivityThread.java:3517)
一月一日至12日:19:22.202:E / AndroidRuntime(16057):... 11个


解决方案

这是一个活动的生命周期问题。当你调用 startActivityForResult(),开始活动被暂停,并可以,如果Android的获取资源不足,被完全摧毁。

当您从开始活动,调用的onActivityResult()月初发生在活动周期返回 - 例如要调用getActivity()内的onActivityResult()中的片段将返回null如果活动实际上是摧毁,但返回一个非空值,如果它没有被破坏。

因此​​,你不能可靠地做任何事情在的onActivityResult()方法复杂。我有两个模式我在这里使用。第一种是只使用的onActivityResult()来存储实例变量的响应,然后采取行动,在 onResume()方法;二是要有条件地执行code:

  @覆盖
公共无效的onActivityResult(最终诠释请求code,最终诠释结果code,最终意向数据){    super.onActivityResult(要求code,结果code,数据);    如果(getActivity()!= NULL){
        //因为我们有一个活动,它不被破坏,我们可以在这里做的东西
    }
}

哪种解决方案使用取决于你正在处理的场景。我使用的第一个解决方案时,正在通过数据意图返回瞬时数据(因为这是唯一的方法我知道了),第二,当调用的onActivityResult()就是这样,我应该从更新的数据存储在别处视图的通知。

I'm trying for updating a contact photo in android through code. Using content Provider Operation I've tried to update the photo. Update query's added in code snippet. But nothing happens. My code snippet is below.

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


        }
    }



}

Stacktrace:

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

解决方案

This is an activity lifecycle issue. When you invoke startActivityForResult(), the starting activity gets suspended and can, if Android gets short of resources, be destroyed altogether.

When you return from the activity you started, the call to onActivityResult() happens early in the activity lifecycle - so for example a call to 'getActivity()' inside onActivityResult() in a fragment will return null if the activity was actually destroyed, but return a non-null value if it wasn't destroyed.

Therefore you can't reliably do anything complex in the onActivityResult() method. I have two patterns I use here. The first is to just use onActivityResult() to store the response in instance variables and then take action in the onResume() method; the second is to conditionally execute code:

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


}

Which solution you use depends on the scenario you are dealing with. I use the first solution when transient data is being returned through the data intent (as this is the only way I get it), and the second when the call to onActivityResult() is just a notification that I should refresh the view from data stored elsewhere.

这篇关于掌握contentprovideroperation NullPointerException异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆