【问题标题】:Android: Failure delivering result ResultInfo. Intent is apparently null?Android:传递结果 ResultInfo 失败。意图显然是空的?
【发布时间】:2012-06-26 12:44:58
【问题描述】:

我正在尝试让用户选择一个音频文件并存储该音频文件的路径。我这样做是通过使用 ACTION_GET_CONTENT Intent 来实现的,这样用户就可以选择一个应用程序来选择文件。但由于某种原因,在 onActivityResult 方法中,Intent 数据 被返回为 null,如错误消息中所示。 Logcat 错误信息和相关代码如下。任何帮助将不胜感激。

主要编辑:- 此错误仅在我按下后退按钮或取消时发生!选择音乐文件实际上工作正常。对于那个很抱歉。尽管如此,错误仍然存​​在。

LogCat 错误:-

06-26 16:36:25.238: E/AndroidRuntime(24759): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=0, data=null} to activity {com.packagename.appname.activityname}: java.lang.NullPointerException

调用放置在 onCreate() 中调用的方法中的选择器活动:-

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setAction(Intent.ACTION_PICK);
intent.setType("audio/*");
startActivityForResult(intent, audioreminder);

onActivityResult() 方法:-

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    SharedPreferences flags = this.getSharedPreferences(
            "screen_on_flags", MODE_WORLD_READABLE);
    SharedPreferences.Editor editor = flags.edit();
    String FilePath = data.getData().getPath();
    switch (requestCode) {
    case audioreminder: {
        if (resultCode == RESULT_OK) {
            editor.putString("audioreminderpath", FilePath);
            editor.commit();
        } else if (resultCode == RESULT_CANCELED){
            CheckBoxPreference other_audioreminder = (CheckBoxPreference) findPreference("other_audioreminder");
            other_audioreminder.setChecked(false);
            }
        break;
    }
    }
}

【问题讨论】:

    标签: android file audio android-intent android-activity


    【解决方案1】:

    我用过,这段代码..

    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(Intent.createChooser(intent, "Gallery"), audioreminder);
    

    另外,在onActivityResult() 中检查Intent data 是否为空

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        if(data != null)
        {
        SharedPreferences flags = this.getSharedPreferences(
                "screen_on_flags", MODE_WORLD_READABLE);
        SharedPreferences.Editor editor = flags.edit();
        String FilePath = data.getData().getPath();
        switch (requestCode) {
        case audioreminder: {
            if (resultCode == RESULT_OK) {
                editor.putString("audioreminderpath", FilePath);
                editor.commit();
            } else if (resultCode == RESULT_CANCELED){
                CheckBoxPreference other_audioreminder = (CheckBoxPreference) findPreference("other_audioreminder");
                other_audioreminder.setChecked(false);
                }
            break;
        }
       }
      }
     else
     {
     Log.e("Intent data:" , "null")
     }
    }
    

    试试这个,让我知道会发生什么..

    【讨论】:

    • 然后只需检查我在回答中提到的 onActivityResult() 中的 Intent data is not null..
    • 感谢您的快速回复。我已经尝试了代码,并且日志确实显示 Intent 数据为空。不再有强制关闭,但不幸的是,这意味着 else if 语句(即resultCode==RESULT_CANCELED)中的代码将永远不会被执行。我想我可以将代码转移到日志语句所在的位置,它会起作用。知道为什么数据为空吗? =) 再次感谢您的时间。你已经回答了我的问题,所以我选择它作为答案^^
    • 实际上,resultCode==RESULT_CANCELED 是有效的,但在你的情况下,你在它之前获得了意图数据,所以它会导致异常..
    • 是的,完全正确。但是,当我按取消时,数据将返回为空。如果我选择音乐文件,数据不为空。因此,由于当我按下或取消时数据总是返回为 null,因此应用程序甚至永远不会尝试执行 RESULT_CANCELED 代码。我不明白为什么按取消会返回一个空意图。我在想这个吗?有点迷茫。
    • 另外,在 onActivityResult() 中维护你的 switch case,因为当你按下它时它会出现:如果你按下返回而不从中选择任何文件,则 RESULT_CANCELED 一如既往地返回 null。
    【解决方案2】:

    不,错误是您的onActivityResult() 方法抛出了NullPointerException,而不是数据一定是null。您需要调试以查看错误在您的方法中的位置。

    【讨论】:

      猜你喜欢
      • 2012-04-07
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多