如果使用默认选择器选择,则Android onactivityresult将返回null

时间:2014-03-10 14:30:04

标签: android onactivityresult

我遇到了这个奇怪的问题,我已经检查了SO并且在网上发现什么都没有,我的代码完全没有问题,我想从片段中选择一个音频文件,这是我的代码:

public void onClick(View arg0)
{
    switch (arg0.getId())
    {
        case R.id.upload_btn_select_file:
            Intent musicIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
            //musicIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION);
            startActivityForResult(musicIntent, REQ_MUSIC);
            break;
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    Log.v("activity result" , "first enter");
    //handle music
    if( requestCode == REQ_MUSIC && resultCode == Activity.RESULT_OK  )
    {
        Log.v("activity result" , "ok");
        Log.v("data" , data.getData()+"");
    }
}

现在,如果我选择一首带有Android默认选择器的歌曲,我会

03-10 17:55:40.160: V/activity result(32644): first enter
03-10 17:55:40.160: V/activity result(32644): ok
03-10 17:55:40.160: V/data(32644): null

但如果我选择与es explorer选择器相同的歌曲,我会

03-10 17:48:46.400: V/activity result(32644): first enter
03-10 17:48:46.400: V/activity result(32644): ok
03-10 17:48:46.400: V/data(32644): content://com.estrongs.files/mnt/sdcard/music/01%20-%20First%20Strike%20Is%20Deadly.mp3

我在xperia-neo-v上使用的是android 4.0,我可以在代码中做些什么来解决这个问题?或者它只是索尼的构建?

3 个答案:

答案 0 :(得分:2)

我已经对收到的意图添加了检查,发现它有密钥

Iterator<String> keyset= data.getExtras().keySet().iterator();
while( keyset.hasNext())
    Log.v("key" , keyset.next());

然后抓住了包含uri的额外内容

Log.v("uri" , data.getExtras().get(RingtoneManager.EXTRA_RINGTONE_PICKED_URI)+"");

答案 1 :(得分:1)

很可能默认选择器没有在getData中返回结果。 (你不能假设所有的选择器都会以相同的方式返回数据)

也许它会将结果返回到数据对象中的额外内容中。

查看额外内容。即data.getExtras()

答案 2 :(得分:0)

无法保证您确实从应用程序执行的意图中获取数据。

我试图从多个应用程序(Facebook,Twitter,Instagram)获得结果,结果是每次:没什么。

我认为这甚至不是默认的Android铃声选择器,索尼用自定义的意图取代AFAIR的Android默认设置。