【问题标题】:App getting force closed on Back Key pressed应用程序在按下后退键时强制关闭
【发布时间】:2012-12-04 14:03:01
【问题描述】:

我正在开发一个 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)

这里用户应该从列表中选择一个联系人,但如果用户在没有选择任何联系人的情况下按下返回按钮,应用程序将被强制关闭。

【问题讨论】:

  • 嗯,让我发布 logcat 错误。
  • 我猜问题出在您包含 对所选联系人进行一些操作 的位置。所以一定要显示代码
  • 你没有测试 resultCode。我假设您执行了一些操作(由于某些奇怪的原因,您认为这些操作与您的问题无关(而快速查看堆栈跟踪(显然您没有采取)会告诉您否则))包括处理接收数据,接下来很可能是 NPE 或 SIOOBE 或其他东西。
  • com.android.business.ReadContacts.onActivityResult(ReadContacts.java:133) 这是哪一行?
  • onActivityResult()这里有代码// Do some operations on the selected contact吗?

标签: android android-contacts vcf-vcard


【解决方案1】:

使用这个...

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

【讨论】:

    【解决方案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
         }
       }
    }
    

    【讨论】:

    • @user370305 如果用户按下返回按钮,你会得到一个 RESULT_CANCELED,所以这个答案是正确的。
    • 是的,这个答案已经奏效了。现在,当按下后退按钮时,前一个活动被打开(它已经通过了打开联系人活动的意图。但是,我使用了@Shyish 所说的 RESULT_CANCELED 来跟踪用户何时从应用程序中逃脱。谢谢你们俩
    【解决方案3】:

    由于在 onActivityResult 方法的第 133 行中抛出 NullPointerException,您的应用程序被强制关闭。检查结果是否有效,并在其中放入一些 try catch。

    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)
    

    【讨论】:

      【解决方案4】:
      I have overidden BackKeyPress() event, but its not working. The app is still getting force closed.
      

      因为backKeyPressed() 事件响应Default Contacts activity(Address Book)。不适用于您的 Android 应用程序的 Activity。

      正如我看到你的代码 onActivityResult() 和 没有任何 logcat 错误我认为这个崩溃可能发生在 Default Contacts activity(Address Book) 端而不是你的应用程序端。此外,您必须检查 Default Contacts activity(Address Book) 是否处理了 onActivityResult() 的任何 Intent(结果意图)作为对其他应用程序的响应目的。

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

      编辑:

      是的,我有一个疑问,您的结果数据是NULL

      在对Intent 进行操作之前,只需检查data 是否为null,

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

      【讨论】:

      • 我认为你是对的,因为应用程序只有在从联系人活动中按下时才会强制关闭。我将发布代码,我正在对选定的联系人执行操作。
      • this 和@Pradeep 的答案都是非常好的方法,因为您应该检查结果代码是否正确(RESULT_OK)并检查接收到的数据是否不为空(这不应该发生,但值得)。
      • 我发现它因为 name_selected 而失败。按下后退按钮时,结果为空。
      • @user370305 是的,你说得对,我也必须进行 Intent null 检查。谢谢你我更新了我的答案
      【解决方案5】:

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

      【讨论】:

      • 我不明白为什么我的回答是否定的。但是,检查@njzk2 评论,这和我说的一样,我认为是正确的答案。
      猜你喜欢
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 2016-10-12
      相关资源
      最近更新 更多