Android Can';录制音频时不要暂停或停止
这是我的代码: RecordActivity.javaAndroid Can';录制音频时不要暂停或停止,android,nullpointerexception,mediarecorder,mp4parser,Android,Nullpointerexception,Mediarecorder,Mp4parser,这是我的代码: RecordActivity.java public class RecordActivity extends ActionBarActivity { protected static final String TAG = "RecordActivity"; private ImageButton start_btn,pause_btn,stop_btn; private MediaRecorder myrecorder = null; long timeInMilliseco
public class RecordActivity extends ActionBarActivity {
protected static final String TAG = "RecordActivity";
private ImageButton start_btn,pause_btn,stop_btn;
private MediaRecorder myrecorder = null;
long timeInMilliseconds = 0L;
long timeSwapBuff = 0L;
long updatedTime = 0L;
Context mcontext;
private String mTargetRecordFileName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_record);
mcontext = this;
start_btn = (ImageButton) findViewById(R.id.im_start_btn);
pause_btn = (ImageButton) findViewById(R.id.im_pause_btn);
stop_btn = (ImageButton) findViewById(R.id.im_stop_btn);
stop_btn.setVisibility(View.INVISIBLE);
pause_btn.setVisibility(View.INVISIBLE);
start_btn.setEnabled(true);
start_btn.setOnClickListener(new OnClickListener() {
@SuppressLint("InlinedApi")
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
start_btn.setVisibility(View.INVISIBLE);
pause_btn.setVisibility(View.VISIBLE);
stop_btn.setVisibility(View.VISIBLE);
start_btn.setEnabled(false);
pause_btn.setEnabled(true);
myrecorder = new MediaRecorder();
myrecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myrecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
myrecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
myrecorder.setOutputFile(getTemporaryFileName());
start(v);
}
private void start(View v) {
// TODO Auto-generated method stub
try{
myrecorder.prepare();
myrecorder.start();
Log.i(TAG, getTemporaryFileName());
} catch(IllegalStateException e){
} catch(IOException e){
}
}
});
pause_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
appendToFile(mTargetRecordFileName, getTemporaryFileName());
myrecorder.stop();
myrecorder.reset();
myrecorder.release();
pause_btn.setVisibility(View.INVISIBLE);
start_btn.setVisibility(View.VISIBLE);
stop_btn.setVisibility(View.VISIBLE);
start_btn.setEnabled(true);
stop_btn.setEnabled(true);
}
});
stop_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
appendToFile(mTargetRecordFileName, getTemporaryFileName());
myrecorder.stop(); // stop recording
myrecorder.reset(); // set state to idle
myrecorder.release(); // release resources back to the system
myrecorder = null;
start_btn.setVisibility(View.VISIBLE);
pause_btn.setVisibility(View.INVISIBLE);
start_btn.setEnabled(true);
}
});
}
private String getTemporaryFileName() {
return mcontext.getCacheDir().getAbsolutePath() + File.separator + "tmprecord";
}
private void appendToFile(final String targetFileName,final String newFileName) {
Mp4ParserWrapper.append(targetFileName, newFileName);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.record, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
public class Mp4ParserWrapper {
public static final int FILE_BUFFER_SIZE = 1024;
private static final String TAG = "Mp4ParserWrapper";
public static boolean append(String mainFileName, String anotherFileName){
boolean rvalue = false;
try{
File targetFile = new File(mainFileName);
File anotherFile = new File(anotherFileName);
if (targetFile.exists() && targetFile.length() > 0) {
String tmpFileName = mainFileName + ".tmp";
append(mainFileName, anotherFileName, tmpFileName);
copyFile(tmpFileName, mainFileName);
rvalue = anotherFile.delete() && new File(tmpFileName).delete();
} else if (targetFile.createNewFile()) {
copyFile(anotherFileName, mainFileName);
rvalue = anotherFile.delete();
}
} catch (IOException e) {
Log.e(TAG,"Append two mp4 files exception", e);
}
return rvalue;
}
public static void copyFile(final String from, final String destination)
throws IOException {
FileInputStream in = new FileInputStream(from);
FileOutputStream out = new FileOutputStream(destination);
copy(in, out);
in.close();
out.close();
}
public static void copy(FileInputStream in, FileOutputStream out) throws IOException {
byte[] buf = new byte[FILE_BUFFER_SIZE];
int len;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
}
public static void append(
final String firstFile,
final String secondFile,
final String newFile) throws IOException {
final Movie movieA = MovieCreator.build(new FileDataSourceImpl(secondFile));
final Movie movieB = MovieCreator.build(new FileDataSourceImpl(firstFile));
final Movie finalMovie = new Movie();
final List<Track> movieOneTracks = movieA.getTracks();
final List<Track> movieTwoTracks = movieB.getTracks();
for (int i = 0; i < movieOneTracks.size() || i < movieTwoTracks.size(); ++i) {
finalMovie.addTrack(new
AppendTrack(movieTwoTracks.get(i),
movieOneTracks.get(i)));
}
final Container container = new DefaultMp4Builder().build(finalMovie);
final FileOutputStream fos = new FileOutputStream(new File(String.format(newFile)));
final WritableByteChannel bb = Channels.newChannel(fos);
container.writeContainer(bb);
fos.close();
}
}
Mp4ParserWrapper.java
public class RecordActivity extends ActionBarActivity {
protected static final String TAG = "RecordActivity";
private ImageButton start_btn,pause_btn,stop_btn;
private MediaRecorder myrecorder = null;
long timeInMilliseconds = 0L;
long timeSwapBuff = 0L;
long updatedTime = 0L;
Context mcontext;
private String mTargetRecordFileName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_record);
mcontext = this;
start_btn = (ImageButton) findViewById(R.id.im_start_btn);
pause_btn = (ImageButton) findViewById(R.id.im_pause_btn);
stop_btn = (ImageButton) findViewById(R.id.im_stop_btn);
stop_btn.setVisibility(View.INVISIBLE);
pause_btn.setVisibility(View.INVISIBLE);
start_btn.setEnabled(true);
start_btn.setOnClickListener(new OnClickListener() {
@SuppressLint("InlinedApi")
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
start_btn.setVisibility(View.INVISIBLE);
pause_btn.setVisibility(View.VISIBLE);
stop_btn.setVisibility(View.VISIBLE);
start_btn.setEnabled(false);
pause_btn.setEnabled(true);
myrecorder = new MediaRecorder();
myrecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myrecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
myrecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
myrecorder.setOutputFile(getTemporaryFileName());
start(v);
}
private void start(View v) {
// TODO Auto-generated method stub
try{
myrecorder.prepare();
myrecorder.start();
Log.i(TAG, getTemporaryFileName());
} catch(IllegalStateException e){
} catch(IOException e){
}
}
});
pause_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
appendToFile(mTargetRecordFileName, getTemporaryFileName());
myrecorder.stop();
myrecorder.reset();
myrecorder.release();
pause_btn.setVisibility(View.INVISIBLE);
start_btn.setVisibility(View.VISIBLE);
stop_btn.setVisibility(View.VISIBLE);
start_btn.setEnabled(true);
stop_btn.setEnabled(true);
}
});
stop_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
appendToFile(mTargetRecordFileName, getTemporaryFileName());
myrecorder.stop(); // stop recording
myrecorder.reset(); // set state to idle
myrecorder.release(); // release resources back to the system
myrecorder = null;
start_btn.setVisibility(View.VISIBLE);
pause_btn.setVisibility(View.INVISIBLE);
start_btn.setEnabled(true);
}
});
}
private String getTemporaryFileName() {
return mcontext.getCacheDir().getAbsolutePath() + File.separator + "tmprecord";
}
private void appendToFile(final String targetFileName,final String newFileName) {
Mp4ParserWrapper.append(targetFileName, newFileName);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.record, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
public class Mp4ParserWrapper {
public static final int FILE_BUFFER_SIZE = 1024;
private static final String TAG = "Mp4ParserWrapper";
public static boolean append(String mainFileName, String anotherFileName){
boolean rvalue = false;
try{
File targetFile = new File(mainFileName);
File anotherFile = new File(anotherFileName);
if (targetFile.exists() && targetFile.length() > 0) {
String tmpFileName = mainFileName + ".tmp";
append(mainFileName, anotherFileName, tmpFileName);
copyFile(tmpFileName, mainFileName);
rvalue = anotherFile.delete() && new File(tmpFileName).delete();
} else if (targetFile.createNewFile()) {
copyFile(anotherFileName, mainFileName);
rvalue = anotherFile.delete();
}
} catch (IOException e) {
Log.e(TAG,"Append two mp4 files exception", e);
}
return rvalue;
}
public static void copyFile(final String from, final String destination)
throws IOException {
FileInputStream in = new FileInputStream(from);
FileOutputStream out = new FileOutputStream(destination);
copy(in, out);
in.close();
out.close();
}
public static void copy(FileInputStream in, FileOutputStream out) throws IOException {
byte[] buf = new byte[FILE_BUFFER_SIZE];
int len;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
}
public static void append(
final String firstFile,
final String secondFile,
final String newFile) throws IOException {
final Movie movieA = MovieCreator.build(new FileDataSourceImpl(secondFile));
final Movie movieB = MovieCreator.build(new FileDataSourceImpl(firstFile));
final Movie finalMovie = new Movie();
final List<Track> movieOneTracks = movieA.getTracks();
final List<Track> movieTwoTracks = movieB.getTracks();
for (int i = 0; i < movieOneTracks.size() || i < movieTwoTracks.size(); ++i) {
finalMovie.addTrack(new
AppendTrack(movieTwoTracks.get(i),
movieOneTracks.get(i)));
}
final Container container = new DefaultMp4Builder().build(finalMovie);
final FileOutputStream fos = new FileOutputStream(new File(String.format(newFile)));
final WritableByteChannel bb = Channels.newChannel(fos);
container.writeContainer(bb);
fos.close();
}
}
公共类MP4Parserrapper{
公共静态最终整型文件\缓冲区\大小=1024;
私有静态最终字符串TAG=“Mp4ParserWrapper”;
公共静态布尔追加(字符串main文件名,字符串另一个文件名){
布尔右值=假;
试一试{
File targetFile=新文件(mainFileName);
File anotherFile=新文件(anotherFileName);
if(targetFile.exists()&&targetFile.length()>0){
字符串tmpFileName=mainFileName+“.tmp”;
追加(主文件名、另一个文件名、tmpFileName);
copyFile(tmpFileName,mainFileName);
rvalue=anotherFile.delete()&新文件(tmpFileName.delete();
}else if(targetFile.createNewFile()){
copyFile(另一个文件名,main文件名);
rvalue=anotherFile.delete();
}
}捕获(IOE异常){
Log.e(标记“附加两个mp4文件异常”,e);
}
返回右值;
}
公共静态void copyFile(最终字符串起始,最终字符串目标)
抛出IOException{
FileInputStream in=新的FileInputStream(来自);
FileOutputStream out=新的FileOutputStream(目标);
复制(输入、输出);
in.close();
out.close();
}
公共静态无效副本(FileInputStream in,FileOutputStream out)引发IOException{
byte[]buf=新字节[文件缓冲区大小];
内伦;
而((len=in.read(buf))!=-1){
out.write(buf,0,len);
}
}
公共静态无效附加(
最后一个字符串firstFile,
最后一个字符串是第二个文件,
最后一个字符串(newFile)引发IOException{
final Movie movieA=MovieCreator.build(新文件DataSourceImpl(第二个文件));
final Movie movieB=MovieCreator.build(新文件datasourceimpl(firstFile));
最终电影finalMovie=新电影();
最终列表movieOneTracks=movieA.getTracks();
最终列表movieTwoTracks=movieB.getTracks();
对于(int i=0;i
我正在使用isoparser1.0 RC-27.jar来合并音频文件。但是我得到了以下错误:
07-21 14:02:15.230: I/RecordActivity(8748): /data/data/com.example.audiorecordertest/cache/tmprecord
07-21 14:02:19.433: D/AndroidRuntime(8748): Shutting down VM
07-21 14:02:19.433: W/dalvikvm(8748): threadid=1: thread exiting with uncaught exception (group=0x41635d40)
07-21 14:02:19.437: E/AndroidRuntime(8748): FATAL EXCEPTION: main
07-21 14:02:19.437: E/AndroidRuntime(8748): Process: com.example.audiorecordertest, PID: 8748
07-21 14:02:19.437: E/AndroidRuntime(8748): java.lang.NullPointerException
07-21 14:02:19.437: E/AndroidRuntime(8748): at java.io.File.fixSlashes(File.java:185)
07-21 14:02:19.437: E/AndroidRuntime(8748): at java.io.File.<init>(File.java:134)
07-21 14:02:19.437: E/AndroidRuntime(8748): at com.example.audiorecordertest.Mp4ParserWrapper.append(Mp4ParserWrapper.java:37)
07-21 14:02:19.437: E/AndroidRuntime(8748): at com.example.audiorecordertest.RecordActivity.appendToFile(RecordActivity.java:195)
07-21 14:02:19.437: E/AndroidRuntime(8748): at com.example.audiorecordertest.RecordActivity.access$7(RecordActivity.java:194)
07-21 14:02:19.437: E/AndroidRuntime(8748): at com.example.audiorecordertest.RecordActivity$2.onClick(RecordActivity.java:98)
07-21 14:02:19.437: E/AndroidRuntime(8748): at android.view.View.performClick(View.java:4456)
07-21 14:02:19.437: E/AndroidRuntime(8748): at android.view.View$PerformClick.run(View.java:18465)
07-21 14:02:19.437: E/AndroidRuntime(8748): at android.os.Handler.handleCallback(Handler.java:733)
07-21 14:02:19.437: E/AndroidRuntime(8748): at android.os.Handler.dispatchMessage(Handler.java:95)
07-21 14:02:19.437: E/AndroidRuntime(8748): at android.os.Looper.loop(Looper.java:136)
07-21 14:02:19.437: E/AndroidRuntime(8748): at android.app.ActivityThread.main(ActivityThread.java:5086)
07-21 14:02:19.437: E/AndroidRuntime(8748): at java.lang.reflect.Method.invokeNative(Native Method)
07-21 14:02:19.437: E/AndroidRuntime(8748): at java.lang.reflect.Method.invoke(Method.java:515)
07-21 14:02:19.437: E/AndroidRuntime(8748): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
07-21 14:02:19.437: E/AndroidRuntime(8748): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
07-21 14:02:19.437: E/AndroidRuntime(8748): at dalvik.system.NativeStart.main(Native Method)
07-21 14:02:15.230:I/RecordActivity(8748):/data/data/com.example.audiorecordertest/cache/tmprecord
07-21 14:02:19.433:D/AndroidRuntime(8748):关闭虚拟机
07-21 14:02:19.433:W/dalvikvm(8748):threadid=1:线程退出时出现未捕获异常(组=0x41635d40)
07-21 14:02:19.437:E/AndroidRuntime(8748):致命异常:主
07-21 14:02:19.437:E/AndroidRuntime(8748):进程:com.example.audiorecordertest,PID:8748
07-21 14:02:19.437:E/AndroidRuntime(8748):java.lang.NullPointerException
07-21 14:02:19.437:E/AndroidRuntime(8748):位于java.io.File.fixSlashes(File.java:185)
07-21 14:02:19.437:E/AndroidRuntime(8748):位于java.io.File.(File.java:134)
07-21 14:02:19.437:E/AndroidRuntime(8748):在com.example.audiorecordertest.Mp4ParserWrapper.append(Mp4ParserWrapper.java:37)
07-21 14:02:19.437:E/AndroidRuntime(8748):位于com.example.audiorecordertest.RecordActivity.appendToFile(RecordActivity.java:195)
07-21 14:02:19.437:E/AndroidRuntime(8748):在com.example.audiorecordertest.RecordActivity.access$7(RecordActivity.java:194)
07-21 14:02:19.437:E/AndroidRuntime(8748):在com.example.audiorecordertest.RecordActivity$2.onClick(RecordActivity.java:98)
07-21 14:02:19.437:E/AndroidRuntime(8748):在android.view.view.performClick(view.java:4456)
07-21 14:02:19.437:E/AndroidRuntime(8748):在android.view.view$PerformClick.run(view.java:18465)
07-21 14:02:19.437:E/AndroidRuntime(8748):在android.os.Handler.handleCallback(Handler.java:733)
07-21 14:02:19.437:E/AndroidRuntime(8748):在android.os.Handler.dispatchMessage(Handler.java:95)上
07-21 14:02:19.437:E/AndroidRuntime(8748):在android.os.Looper.loop(Looper.java:136)
07-21 14:02:19.437:E/AndroidRuntime(8748):在android.app.ActivityThread.main(ActivityThread.java:5086)上
07-21 14:02:19.437:E/AndroidRuntime(8748):位于java.lang.reflect.Method.Invokenactive(本机方法)
07-21 14:02:19.437:E/AndroidRuntime(8748):位于java.lang.reflect.Method.invoke(Method.java:515)
07-21 14:02:19.437:E/AndroidRuntime(8748):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
07-21 14:02:19.437:E/AndroidRuntime(8748):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
07-21 14:02:19.437:E/AndroidRuntime(8748):在dalvik.system.NativeStart.main(本机方法)
最好知道我使用的容器是什么,以及如何将音频文件从容器移动到sd卡。以下行导致了问题:
appendToFile(mTargetRecordFileName, getTemporaryFileName());
您已经声明了
mTargetRecordFileName
,但没有在任何地方初始化它,因此它试图使用null
文件名执行文件操作
以下方法将为根外部存储中的文件返回一个文件名,您可以将该文件分配给
mTargetRecordFileName
:
private String getOutputFile()
{
return Environment.getExternalStorageDirectory() +
File.separator + "media_file_name.mp4";
}
此外,请确保您在清单中具有以下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
mTargetRecordFileName
没有在任何地方初始化。但是我正在我的MP4ParserRapper中检查这一点,如果(targetFile.exists()&&targetFile.length()>0){String tmpFileName=mainFileName+“.tmp”;append(mainFileName,另一个文件名,tmpFileName);copyFile(tmpFileName,mainFileN