【问题标题】:Error when trying to play audio file from URI尝试从 URI 播放音频文件时出错
【发布时间】:2015-11-21 12:20:03
【问题描述】:

所以我对 Android 编程完全陌生,我开始尝试制作一个允许用户编辑音频文件的应用程序。到目前为止,这是我的代码,它使用户上传音频文件并播放它:

public class MainActivity extends Activity {
    final int ACTIVITY_CHOOSE_FILE = 1;
    public String filePath;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) this.findViewById(R.id.uploadbutton);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent chooseFile;
                Intent intent;
                chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
                chooseFile.setType("audio/mpeg");
                intent = Intent.createChooser(chooseFile, "Choose a file");
                startActivityForResult(intent, ACTIVITY_CHOOSE_FILE);
            }
        });

        Button playButton = (Button)findViewById(R.id.playbutton);
        playButton.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                        MediaPlayer mediaPlayer = new MediaPlayer();
                        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                            @Override
                            public void onPrepared(MediaPlayer mp) {
                                mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
                                try {
                                    mp.setDataSource(getApplicationContext(), Uri.parse(filePath));
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                                try {
                                    mp.prepare();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                                mp.start();
                            }
                        });

            }
        });
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case ACTIVITY_CHOOSE_FILE: {
                if (resultCode == RESULT_OK) {
                    Uri uri = data.getData();
                    filePath = uri.getPath();
                    getFilePath(filePath);
                    TextView URI_Text = (TextView)findViewById(R.id.file_URI);
                    URI_Text.setText(filePath);
                }
            }
        }
    }

    public String getFilePath (String filePath) {
        return filePath;
    }

}

但是,我收到错误代码E/Surface: getSlotFromBufferLocked: unknown buffer: 0xab756e00

我做错了什么?

【问题讨论】:

    标签: java android audio


    【解决方案1】:

    该错误与您问题中的任何代码都无关。但是,您在其他地方会出错。

    getPath() 没用。 Uri 应被视为不透明句柄。在Uri 上调用getPath(),并期望文件位于该路径,这类似于期望在您的计算机硬盘驱动器上存在/questions/33843271/error-when-trying-to-play-audio-file-from-uri 路径,只是因为您的浏览器恰好显示了一个带有该路径的URL路径。

    此外,您对Uri 所代表的数据的访问是短暂的。这让人想起 Web 开发,您可能可以在一段时间内从某个 URL 流式传输数据,但最终您的会话会超时。保存Uri 毫无意义。要么立即使用数据(通过ContentResolveropenInputStream()),要么根本不处理数据。

    【讨论】:

    • 谢谢。我想我必须对你提到的术语做更多的研究,因为它们对我来说是陌生的,但这绝对是朝着正确方向迈出的一步。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多