所以我对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
我做错了什么?
答案 0 :(得分:0)
该错误与您问题中的任何代码无关。但是,你在其他地方出错了。
getPath()
没用。 Uri
应被视为不透明句柄。在getPath()
上调用Uri
,并期望文件位于该路径上,类似于期望计算机硬盘上有/questions/33843271/error-when-trying-to-play-audio-file-from-uri
路径,只是因为您的浏览器碰巧显示带有该路径的URL。
此外,您对Uri
所代表的数据的访问权限是短暂的。这让人想起Web开发,您可能会在一段时间内从某个URL流式传输数据,但最终会话超时。保存Uri
毫无意义。现在消耗数据(通过ContentResolver
和openInputStream()
),或者根本不打算使用数据。