Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Can';录制音频时不要暂停或停止_Android_Nullpointerexception_Mediarecorder_Mp4parser - Fatal编程技术网

Android Can';录制音频时不要暂停或停止

Android 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

这是我的代码:

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 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