2012-12-17 63 views
3

我正在使用VCard应用程序。在这里我开始了默认联系人活动(地址簿)。现在应用程序获取强制关闭后退键按下

,应用程序的流程是这样的,

  • 用户启动应用程序。
  • 默认联系簿已打开。
  • 用户从列表中选择一个联系人,然后创建所选联系人的Vcard。

现在,当用户按下Back Button而没有选择任何联系人时,应用程序会强制关闭。

我有事件BackKeyPress()事件,但它不工作。该应用程序仍在关闭。

我张贴的参考代码,

protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
     startActivityForResult(intent, 1); 
     Log.d("In Oncreate", "Activity Result"); 
    } 
    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
     //preventing default implementation previous to android.os.Build.VERSION_CODES.ECLAIR 
      Toast.makeText(getApplicationContext(), "Back Pressed", 5000).show(); 
      finish(); 
     return true; 
     } 
     return super.onKeyDown(keyCode, event);  
    } 
    @Override 
    public void onActivityResult(int reqCode, int resultCode, Intent data) { 
     super.onActivityResult(reqCode, resultCode, data); 

     switch (reqCode) { 
     case (1) : 
      counter = "Yes"; 
    Log.d("My Tag", data.getExtras().keySet().toString()); 
    name_selected = data.getExtras().getString("android.intent.extra.shortcut.NAME"); 
    Log.d("My Tag", name_selected)); 
    Intent i = new Intent(getApplicationContext(), BusinessCardActivity.class); 
    i.putExtra("name", name_selected); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    getApplicationContext().startActivity(i); 
     } 
    } 
} 

logcat的错误: -

12-17 18:41:09.399: E/AndroidRuntime(23456): FATAL EXCEPTION: main 
12-17 18:41:09.399: E/AndroidRuntime(23456): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=0, data=null} to activity {com.android.business/com.android.business.ReadContacts}: java.lang.NullPointerException 
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.app.ActivityThread.deliverResults(ActivityThread.java:2536) 
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.app.ActivityThread.handleSendResult(ActivityThread.java:2578) 
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.app.ActivityThread.access$2000(ActivityThread.java:117) 
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:961) 
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.os.Looper.loop(Looper.java:123) 
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.app.ActivityThread.main(ActivityThread.java:3729) 
12-17 18:41:09.399: E/AndroidRuntime(23456): at java.lang.reflect.Method.invokeNative(Native Method) 
12-17 18:41:09.399: E/AndroidRuntime(23456): at java.lang.reflect.Method.invoke(Method.java:507) 
12-17 18:41:09.399: E/AndroidRuntime(23456): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:874) 
12-17 18:41:09.399: E/AndroidRuntime(23456): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:632) 
12-17 18:41:09.399: E/AndroidRuntime(23456): at dalvik.system.NativeStart.main(Native Method) 
12-17 18:41:09.399: E/AndroidRuntime(23456): Caused by: java.lang.NullPointerException 
12-17 18:41:09.399: E/AndroidRuntime(23456): at com.android.business.ReadContacts.onActivityResult(ReadContacts.java:133) 
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.app.Activity.dispatchActivityResult(Activity.java:3908) 
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.app.ActivityThread.deliverResults(ActivityThread.java:2532) 

这里,用户应该从列表中选择一个联系人,但如果用户按下后退按钮没有选择任何联系人,该应用程序就会关闭。

+1

哪里是logcat的错误??? – user370305

+0

提供您的logcat plz –

+0

hmm,让我发布logcat错误。 –

回答

2

在你OnActivityResult()做..

@Override 
    public void onActivityResult(int reqCode, int resultCode, Intent data) { 
    super.onActivityResult(reqCode, resultCode, data); 

    switch (reqCode) { 
    case (1) : 
    if (data != null && resultCode == RESULT_OK) { 
     counter = "Yes"; 
    // Do some operations on the selected contact 
    } 
    } 
} 
+0

@ user370305如果用户按下后退按钮,则会得到RESULT_CANCELED,所以此答案是正确的。 – Aballano

+0

是的,这个答案已经奏效。现在当后退按钮被按下时,前面的活动被打开(它已经通过了打开联系人活动的意图,但是,我已经使用了RESULT_CANCELED来说明@Shyish是如何跟踪用户何时从应用程序中退出的。 –

1
I have overidden BackKeyPress() event, but its not working. The app is still getting force closed. 

因为backKeyPressed()事件响应Default Contacts activity(Address Book)。不是你的Android应用程序的活动。

当我看到你的onActivityResult()代码,而无需任何的logcat错误我想这可能坠毁在Default Contacts activity(Address Book)方不要在你的应用程序一侧发生。您也必须检查是否为Default Contacts activity(Address Book)作为对其他应用程序的响应目的处理任何Intent(受邀意向)onActivityResult()

所以logcat错误将在这里更有帮助。

编辑:

是啊,因为我有一个疑问,你造成数据NULL

Intent做术前只检查data是否与否,

if(data != null) 
{ 
Log.d("My Tag", data.getExtras().keySet().toString()); 
    name_selected = data.getExtras().getString("android.intent.extra.shortcut.NAME"); 
    Log.d("My Tag", name_selected)); 
    Intent i = new Intent(getApplicationContext(), BusinessCardActivity.class); 
    i.putExtra("name", name_selected); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    getApplicationContext().startActivity(i); 
} 
+0

我认为你是对的,因为应用程序只有从联系人活动中按回时才会关闭。我会发布代码,在所选联系人上执行操作。 –

+0

这个和@Pradeep答案都是非常好的方法,因为您应该检查结果代码是否正确(RESULT_OK),并检查接收到的数据是否不为空(不应该发生,但值得)。 – Aballano

+0

我发现它由于** name_selected **而失败。当后退按钮被按下时它变为空。 –

-1

您是否管理没有选定联系人的情况?如果用户按下并且没有选择联系人,请在onActivityResult中处理“联系人”为空。

+1

我不明白为什么我在我的答案中得到否定。然而,检查@ njzk2评论,这是我说的相同,我认为是正确的答案。 – Aballano

1

你的应用程序获取强制关闭因您的onActivityResult方法,管线133抛出一个NullPointerException。检查结果是否有效,并在那里放一些尝试。

12-17 18:41:09.399: E/AndroidRuntime(23456): Caused by: java.lang.NullPointerException 
12-17 18:41:09.399: E/AndroidRuntime(23456): at com.android.business.ReadContacts.onActivityResult(ReadContacts.java:133) 
3

使用本...

 @Override 
public void onActivityResult(int reqCode, int resultCode, Intent data) { 
    super.onActivityResult(reqCode, resultCode, data); 

    switch (reqCode) { 
    case 1: 
    if(data!=null&&resultCode==RESULT_OK){ 


     counter = "Yes"; 
Log.d("My Tag", data.getExtras().keySet().toString()); 
name_selected = data.getExtras().getString("android.intent.extra.shortcut.NAME"); 
Log.d("My Tag", name_selected)); 
Intent i = new Intent(getApplicationContext(), BusinessCardActivity.class); 
i.putExtra("name", name_selected); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
getApplicationContext().startActivity(i); 
    } 
    } 
}