我想录制声音,然后有能力听到重新编码的声音。我有文件路径,但MediaPlayer也不会播放。我看过MediaPlayer的一些示例,我认为只是这样:
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(path); // + File.separator + fileName
mp.prepare();
mp.start();
我的路径是:/ storage / emulated / 0 / recordings /音乐录制/音频录制2017-02-06 00-17-12.amr
Logcat:
02-06 00:21:23.151 12308-12391 / com.example.studerande.upg32 D / OpenGLRenderer:0x7aea6a7400(RippleDrawable)上的endAllActiveAnimators,句柄为0x7aea5d6fc0
02-06 00:21:28.633 12308-12308 / com.example.studerande.upg32 E / recordapp:文件存在
02-06 00:21:28.636 12308-12308 / com.example.studerande.upg32 W / System.err:java.io.FileNotFoundException:/ storage / emulated / 0 / recordings /音乐录音/音频录音2017-02-06 00-21-23.amr(权限被拒绝)
02-06 00:21:28.636 12308-12308 / com.example.studerande.upg32 W / System.err:位于java.io.FileInputStream.open(本机方法)
02-06 00:21:28.636 12308-12308 / com.example.studerande.upg32 W / System.err:at java.io.FileInputStream。(FileInputStream.java:146)
02-06 00:21:28.636 12308-12308 / com.example.studerande.upg32 W / System.err:位于android.media.MediaPlayer.setDataSource(MediaPlayer.java:1088)
02-06 00:21:28.636 12308-12308 / com.example.studerande.upg32 W / System.err:位于android.media.MediaPlayer.setDataSource(MediaPlayer.java:1039)
02-06 00:21:28.636 12308-12308 / com.example.studerande.upg32 W / System.err:位于com.example.studerande.upg32.MainActivity.audioPlayer(MainActivity.java:105)
02-06 00:21:28.636 12308-12308 / com.example.studerande.upg32 W / System.err:位于com.example.studerande.upg32.MainActivity.onActivityResult(MainActivity.java:95)
02-06 00:21:28.636 12308-12308 / com.example.studerande.upg32 W / System.err:位于android.app.Activity.dispatchActivityResult(Activity.java:6917)
02-06 00:21:28.636 12308-12308 / com.example.studerande.upg32 W / System.err:位于android.app.ActivityThread.deliverResults(ActivityThread.java:4049)
02-06 00:21:28.636 12308-12308 / com.example.studerande.upg32 W / System.err:位于android.app.ActivityThread.handleSendResult(ActivityThread.java:4096)
02-06 00:21:28.636 12308-12308 / com.example.studerande.upg32 W / System.err:位于android.app.ActivityThread.-wrap20(ActivityThread.java)
02-06 00:21:28.636 12308-12308 / com.example.studerande.upg32 W / System.err:at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1516)
02-06 00:21:28.636 12308-12308 / com.example.studerande.upg32 W / System.err:位于android.os.Handler.dispatchMessage(Handler.java:102)
02-06 00:21:28.636 12308-12308 / com.example.studerande.upg32 W / System.err:at android.os.Looper.loop(Looper.java:154)
02-06 00:21:28.636 12308-12308 / com.example.studerande.upg32 W / System.err:at android.app.ActivityThread.main(ActivityThread.java:6077)
02-06 00:21:28.636 12308-12308 / com.example.studerande.upg32 W / System.err:at java.lang.reflect.Method.invoke(本机方法)
02-06 00:21:28.637 12308-12308 / com.example.studerande.upg32 W / System.err:at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:865)
02-06 00:21:28.637 12308-12308 / com.example.studerande.upg32 W / System.err:at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
02-06 00:21:28.637 12308-12308 / com.example.studerande.upg32 E / MYAPP:例外
java.io.FileNotFoundException:/ storage / emulated / 0 / recordings /音乐录制/音频录制2017-02-06 00-21-23.amr(权限被拒绝)
在java.io.FileInputStream.open(本机方法)
在java.io.FileInputStream。(FileInputStream.java:146)
在android.media.MediaPlayer.setDataSource(MediaPlayer.java:1088)
在android.media.MediaPlayer.setDataSource(MediaPlayer.java:1039)
在com.example.studerande.upg32.MainActivity.audioPlayer(MainActivity.java:105)
在com.example.studerande.upg32.MainActivity.onActivityResult(MainActivity.java:95)
在android.app.Activity.dispatchActivityResult(Activity.java:6917)
在android.app.ActivityThread.deliverResults(ActivityThread.java:4049)
在android.app.ActivityThread.handleSendResult(ActivityThread.java:4096)
在android.app.ActivityThread.-wrap20(ActivityThread.java)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1516)
在android.os.Handler.dispatchMessage(Handler.java:102)
在android.os.Looper.loop(Looper.java:154)
在android.app.ActivityThread.main(ActivityThread.java:6077)
在java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:865)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
我的mainactivity的java代码:
package com.example.studerande.upg32;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import static android.app.Activity.RESULT_OK;
public class MainActivity extends AppCompatActivity {
private static final int RECORDING_ACTIVE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button recordbutton = (Button) findViewById(R.id.record_button);
recordbutton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Button record_button = (Button) findViewById(R.id.record_button);
record_button.setText("starting recording..");
startRecord();
}
});
}
public File getTempFile(Context context, String url) {
File file = null;
try {
String fileName = Uri.parse(url).getLastPathSegment();
file = File.createTempFile(fileName, null, context.getCacheDir());
} catch (IOException e) {
// Error while creating file
}
return file;
}
public void startRecord()
{
// NOTE THAT THE USER MUST HAVE A RECORDING SOFTWARE. NOT ALL DEVICES HAVE THIS.
Intent recordingApplicationIntent = new Intent();
recordingApplicationIntent.setAction(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
startActivityForResult(recordingApplicationIntent, RECORDING_ACTIVE);
}
private String getAudioFilePathFromUri(Uri uri) {
Cursor cursor = getContentResolver()
.query(uri, null, null, null, null);
cursor.moveToFirst();
int index = cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DATA);
return cursor.getString(index);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == RECORDING_ACTIVE && resultCode == RESULT_OK)
{
Context context;
Toast.makeText(this, "Sound recoding intent success", Toast.LENGTH_SHORT).show();
String thefilename = "";
Bundle extras = data.getExtras();
Uri uri = data.getData();
String filePath = getAudioFilePathFromUri(uri);
thefilename = filePath;
Button record_button = (Button) findViewById(R.id.record_button);
record_button.setText(thefilename);
File sourceFile = new File(filePath);
if (!sourceFile.isFile()) {
Log.e("recordapp", "file does not exist");
// return 0;
}
else
{
Log.e("recordapp", "File exist");
audioPlayer(filePath);
}
}
}
public void audioPlayer(String path){
//set up MediaPlayer
MediaPlayer mp = new MediaPlayer();
try {
mp.setDataSource(path); // + File.separator + fileName
mp.prepare();
mp.start();
} catch (Exception e) {
e.printStackTrace();
Log.e("MYAPP", "exception", e);
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
我有以下权限
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
在我的Android清单文件中。
最佳答案
我想您在android API 23+上运行应用程序。由于清单中的所有权限都是dangerous权限,因此您需要在运行时中请求它。 Tutorial。
一些例子:
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
PERMISSION_REQUEST_CODE);
// PERMISSION_REQUEST_CODE is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}