【问题标题】:Android select mp3 file安卓选择mp3文件
【发布时间】:2014-02-21 02:41:48
【问题描述】:

抱歉,如果这个问题已经得到解答,但我不能很好地说明我的问题。 我有一个活动需要您设备中的歌曲文件,当我按下按钮打开对话框询问您要如何打开文件(例如选择文件资源管理器)然后用户将选择时,我想要它一个MP3文件(应该可以进入内部内存和外部,至少有用户可用的内存和外部,如我的Xperia V中有2个内部分区和SD卡),并且选择音乐文件时(.wav , .mp3, .acc 文件)在我的应用程序中加载其名称和文件路径。我该怎么做? 我没有提供任何代码,因为这就是我所需要的

【问题讨论】:

标签: android mp3 android-file


【解决方案1】:

要打开文件资源管理器,requestCode 只是一个整数,因此请传递 1

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("audio/*"); // specify "audio/mp3" to filter only mp3 files
startActivityForResult(intent,1);

设置媒体播放器,

MediaPlayer player = new MediaPlayer();
player.setAudioStreamType(AudioManager.STREAM_MUSIC);

从资源管理器中获取结果文件,

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

 /*check whether you're working on correct request using requestCode , In this case 1*/

    if(requestCode == 1 && resultCode == Activity.RESULT_OK){
        audio = data.getData(); //declared above Uri audio;
        Log.d("media", "onActivityResult: "+audio);
    }

    super.onActivityResult(requestCode, resultCode, data);
}

开始播放音频,

 player.setDataSource(new FileInputStream(new File(audio.getPath())).getFD());

 player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
                    player.start();
                }
            });

 player.prepareAsync();

要停止音频,

 if(player.isPlaying())
            player.stop();

最后,在清单中添加读取外部文件的权限,

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

添加您的控制器小部件并使用 MediaPlayer 方法来创建自定义的 Mp3 播放器;)

【讨论】:

  • 我尝试了您的解决方案,但不知道为什么会出现此错误:/document/802: open failed: ENOENT (No such file or directory)
  • 它以文档格式返回 URI,使用 FIleUtils 将其转换回绝对路径
【解决方案2】:

对 2Dee 的回答稍作修正:

    Intent audiofile_chooser_intent;
    audiofile_chooser_intent = new Intent();
    audiofile_chooser_intent.setAction(Intent.ACTION_GET_CONTENT);
    audiofile_chooser_intent.setType("audio/*");
    ActivityOptions options = ActivityOptions.makeScaleUpAnimation(view, 0,
            0, view.getWidth(), view.getHeight());
    startActivityForResult(Intent.createChooser(audiofile_chooser_intent, getString(R.string.select_audio_file_title)), RQS_OPEN_AUDIO_MP3, options.toBundle());

    Toast("File Chooser initiated..");

在 OnClick 侦听器方法中启动 FileChooser Activity/Dialog 的意图

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == RQS_OPEN_AUDIO_MP3) {
            Uri audioFileUri = data.getData();

            String MP3Path = audioFileUri.getPath();
            Toast(MP3Path);


        }
    }
}

OnActivityResult方法获取选中文件的FilePath以备后续使用

【讨论】:

  • 让我明白这一点:您的“更正”是从文件类型中删除 mpeg 文件扩展名来选择?这如何纠正我的答案?那如何改善呢?你甚至知道你发布的代码是做什么的吗?为什么要添加 ActivityOptions.makeScaleUpAnimation 以及为什么需要选择 mp3 文件?这么多问题,我可能永远也得不到答案。啊,SO的乐趣:-)
  • 你花了一年时间才注意到这一点:P @2Dee
【解决方案3】:

我使用以下内容来选择一个 mp3 文件:

Intent intent;
intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("audio/mpeg");
startActivityForResult(Intent.createChooser(intent, getString(R.string.select_audio_file_title)), REQ_CODE_PICK_SOUNDFILE);

然后你可以在 onActivityResult 中取回 Uri :

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQ_CODE_PICK_SOUNDFILE && resultCode == Activity.RESULT_OK){
        if ((data != null) && (data.getData() != null)){
            Uri audioFileUri = data.getData();
            // Now you can use that Uri to get the file path, or upload it, ...
            }
        }
}

我相信选择其他类型的音频文件将是通过 intent.setType("audio/*) 在 MIME 类型中设置通配符的问题,尽管我还没有测试过。

如果这对你有用,请告诉我;-)

【讨论】:

  • 什么是 REQ_CODE_PICK_SOUNDFILE
  • 它是 startActivityForResult 和 onActivityResult 中使用的请求代码,用于帮助确定您获得的结果(如果您可以启动不同的活动来获得不同类型的结果,这将非常有用,例如一个选择音频文件,另一个选择或拍照等...)。官方文档:developer.android.com/reference/android/app/…, int)
猜你喜欢
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 2021-12-18
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多