2012-02-29 3 views
0

초보자이며 새로운 연락처가 추가되었을 때 알림을 받고 싶은 앱을 개발 중입니다. 다음 코드를 시도했지만 Logcat 추적과 같은 오류가 발생합니다.연락처에 대한 ContentObserver의 오류

내가 가진 또 다른 질문은 사용자가 내 앱을 종료해도 알림을 받거나 내 서비스를 작성하고 백그라운드에서 실행해야하는지 여부입니다. 내 앱에서 내 ContentObserver를 등록하면됩니다. Plz은이

public class TrackContactActivity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
B obj=new B(new Handler()); 
obj.register(getApplicationContext()); 
} 
} 

로그 캣 추적 제가 위에서 클래스의 객체를 생성 한 샘플 활동

public class B extends ContentObserver { 
Context ctx; 
String ContactId,DisplayName; 
final String[] projection = new String[] { ContactsContract.Contacts._ID}; 
Cursor curval,people; 
private static final String TAG = "NewContactTrackService"; 
@Override 
public boolean deliverSelfNotifications() { 
// TODO Auto-generated method stub 
Log.e(TAG, "Self notification called"); 
return true; 

} 

@Override 
public void onChange(boolean selfChange) { 
// TODO Auto-generated method stub 
//super.onChange(selfChange); 
Log.e(TAG, "Onchange Called"); 
people = ctx.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
while(people.moveToNext()) 
{ 
// values.clear(); 

ContactId = people.getString(people.getColumnIndex(ContactsContract.Contacts._ID)); 
DisplayName = people.getString(people.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
Log.e(TAG, "New Contact with contact id "+ContactId); 
Log.e(TAG, "New Contact Displayname "+DisplayName); 
} 
} 

public B(Handler handler) { 
super(handler); 
Log.e(TAG, "Handler Called"); 
// TODO Auto-generated constructor stub 
} 
public void register(Context ctx) 
{ 
Log.e(TAG, "Registering"); 
this.ctx=ctx; 
curval = ctx.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, projection, null, null, null); 
curval.registerContentObserver(new B(new Handler())); 
Log.e(TAG, "Registered"); 
} 
} 

도움 :

02-29 20:59:59.571: ERROR/AndroidRuntime(324): ERROR: thread attach failed 
02-29 20:59:59.951: ERROR/NewContactTrackService(330): Handler Called 
02-29 20:59:59.951: ERROR/NewContactTrackService(330): Registering 
02-29 21:00:00.050: ERROR/NewContactTrackService(330): Handler Called 
02-29 21:00:00.050: ERROR/NewContactTrackService(330): Registered 
02-29 21:01:35.270: ERROR/NewContactTrackService(330): Onchange Called 
02-29 21:01:35.281: ERROR/AndroidRuntime(330): Uncaught handler: thread main exiting due to uncaught exception 
02-29 21:01:35.281: ERROR/AndroidRuntime(330): java.lang.NullPointerException 
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at com.sample.B.onChange(B.java:29) 
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at android.database.ContentObserver$NotificationRunnable.run(ContentObserver.java:43) 
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at android.os.Handler.handleCallback(Handler.java:587) 
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at android.os.Handler.dispatchMessage(Handler.java:92) 
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at android.os.Looper.loop(Looper.java:123) 
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at android.app.ActivityThread.main(ActivityThread.java:4363) 
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at java.lang.reflect.Method.invokeNative(Native Method) 
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at java.lang.reflect.Method.invoke(Method.java:521) 
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at dalvik.system.NativeStart.main(Native Method) 
02-29 21:01:35.361: ERROR/dalvikvm(330): Unable to open stack trace file '/data/anr/traces.txt': Permission denied 
02-29 21:01:38.641: ERROR/gralloc(65): [unregister] handle 0x3236c0 still locked (state=40000001) 
+0

정확히 29 행의 B.java 클래스로 작성된 내용. – AAnkit

+0

@AnkitAwasthi people = ctx.getContentResolver(). query (ContactsContracts.CONTENT_URI, null, null, null, null); –

답변

0

하는 선 아래 변경해보십시오

Context ctx; 

~와 함께

static Context ctx; 

.

더 나은 해결책은 등록 방법에서 응용 프로그램 컨텍스트를 전달하는 것입니다.

+0

감사합니다 ... –

+0

컨텍스트에 정적 참조를 유지하는 것은 바람직하지 않습니다. – peter

+1

@PeterChaula 예, 권장하지 않습니다. UI 요소에서 필요할 때마다 전달하십시오. – AAnkit