E / MediaRecorder(942):开始失败:-2147483648

时间:2014-08-19 23:14:06

标签: android mediarecorder android-mediarecorder

我正在尝试创建呼叫记录器以在后台运行Service但我得到MediaRecorder启动失败错误,当它尝试在后台启动mediarecorder时,java代码给出

使用的Java代码如下:

MainActivity.java

package com.example.callrecorder2;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {

    // onCreate method.
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Initialise display.
        setContentView(R.layout.activity_main);

        // Declare buttons for Start and Stop.
        Button startService = (Button)findViewById(R.id.startbutton);
        Button stopService  = (Button)findViewById(R.id.stopbutton);

        // Set listeners for buttons.
        startService.setOnClickListener(startServiceListener);
        stopService.setOnClickListener(stopServiceListener); 

        // Initialise serviceStatus text field in display.
        TextView tv = (TextView) findViewById(R.id.recording_status);
        tv.setText(getString(R.string.rec_stop_status));

    }   
    // Define OnClickListener for Start Service button.
    private OnClickListener startServiceListener = new OnClickListener() {
        public void onClick(View v){

            // Start the Service.
            Intent serviceIntent = new Intent(MainActivity.this,callreceiverservice.class);
            startService(serviceIntent);
            Log.i("DUMDUM","Start Button Clicked");
            // Display Service Running message.
            TextView tv = (TextView) findViewById(R.id.recording_status);
            tv.setText(getString(R.string.rec_start_status));
        }               
    };
    // Define OnClickListener for Stop Service button.
    private OnClickListener stopServiceListener = new OnClickListener() {
        public void onClick(View v){

            // Stop the Service.
            Intent serviceIntent = new Intent(MainActivity.this,callreceiverservice.class);
            stopService(serviceIntent);
            Log.i("DUMDUM","Stop Button Clicked");

            // Display Service Not Running message.
            TextView tv = (TextView) findViewById(R.id.recording_status);
            tv.setText(getString(R.string.rec_stop_status));
        }               
    };


}

callreceiverservice.java

package com.example.callrecorder2;

import java.io.File;
import java.io.IOException;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;

public class callreceiverservice extends Service  {
    int checkIt = 0;
    Context contextt;
    private static final String ACTION="android.intent.action.PHONE_STATE";
    private BroadcastReceiver yourReceiver;

    private static final String AUDIO_RECORDER_FILE_EXT_3GP = ".3gp";
    private static final String AUDIO_RECORDER_FILE_EXT_MP4 = ".mp4";
    private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder";

    private MediaRecorder recorder = null;  
    private int currentFormat = 0;
    private int output_formats[] = { MediaRecorder.OutputFormat.THREE_GPP ,MediaRecorder.OutputFormat.MPEG_4 };
    private String file_exts[] = { AUDIO_RECORDER_FILE_EXT_3GP , AUDIO_RECORDER_FILE_EXT_MP4 }; 
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;        
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {

        Log.i("DUMDUM","Into onStartCommand");
        final IntentFilter theFilter = new IntentFilter();
        theFilter.addAction(ACTION);
        this.yourReceiver = new BroadcastReceiver(){
             @Override
                public void onReceive(Context context, Intent intent) {
                    contextt = context;
                    TelephonyManager tm = (TelephonyManager) context.getSystemService(
                            Context.TELEPHONY_SERVICE);
                    tm.listen(new CallStateListener(), PhoneStateListener.LISTEN_CALL_STATE);
                    Log.i("DUMDUM","Into onRecieve");

             }  
        };      
        this.registerReceiver(this.yourReceiver, theFilter);
        return START_STICKY;
    }


    class CallStateListener extends PhoneStateListener {

        private String getFilename(){
            String filepath = Environment.getExternalStorageDirectory().getPath();
            File file = new File(filepath,AUDIO_RECORDER_FOLDER);

            if(!file.exists()){
                file.mkdirs();
            }

            return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + file_exts[currentFormat]);
        }
        private MediaRecorder.OnErrorListener errorListener = new MediaRecorder.OnErrorListener() {
            @Override
            public void onError(MediaRecorder mr, int what, int extra) {
                AppLog.logString("Error: " + what + ", " + extra);
            }
        };

        private MediaRecorder.OnInfoListener infoListener = new MediaRecorder.OnInfoListener() {
            @Override
            public void onInfo(MediaRecorder mr, int what, int extra) {
                AppLog.logString("Warning: " + what + ", " + extra);
            }
        };

            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                //Log.i("DUMDUM","Into Call state Listener Class");
                super.onCallStateChanged(state, incomingNumber);
                switch (state) {
                case TelephonyManager.CALL_STATE_RINGING:
                    // called when someone is ringing to this phone

                    Toast.makeText(contextt, "Incoming: " + incomingNumber,
                            Toast.LENGTH_LONG).show();
                    checkIt = 1;
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    Toast.makeText(contextt, "CALL_STATE_OFFHOOK " + incomingNumber,
                            Toast.LENGTH_LONG).show();

                    recorder = new MediaRecorder();
                    AppLog.logString("setAudioSource(): " + MediaRecorder.AudioSource.VOICE_CALL);
                    recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
                    AppLog.logString("setOutputFormat: " + output_formats[currentFormat]);
                    recorder.setOutputFormat(output_formats[currentFormat]);
                    AppLog.logString("setAudioEncoder(): " + MediaRecorder.AudioEncoder.AMR_NB);
                    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                    AppLog.logString("getFilename(): " + getFilename());
                    recorder.setOutputFile(getFilename());

                    recorder.setOnErrorListener(errorListener);
                    recorder.setOnInfoListener(infoListener);

                    try {
                        recorder.prepare();
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        recorder.start();
                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    checkIt = 0;
                    break;
                case TelephonyManager.CALL_STATE_IDLE:
                    Toast.makeText(contextt, "CALL_STATE_IDLE " + incomingNumber,
                            Toast.LENGTH_LONG).show();

                    if (recorder != null) {
                          recorder.stop();
                          recorder.release();
                          recorder = null;
                       }
                    if (checkIt == 1) {
                     //startting the service
                        break;
                    }
                }

            }

        }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // Do not forget to unregister the receiver!!!
        Log.i("DUMDUM","Into onDestroy");
        this.unregisterReceiver(this.yourReceiver);
    }
}

AppLog.java

package com.example.callrecorder2;

import android.util.Log;

public class AppLog {
private static final String APP_TAG = "AudioRecorder";

    public static int logString(String message){
        return Log.i(APP_TAG,message);
    }

}

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.callrecorder2"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".callreceiverservice"> 
            </service>
    </application>

</manifest>

应用程序的Logcat显示错误消息:

08-19 19:49:06.582: E/MediaRecorder(942): start failed: -2147483648
08-19 19:49:06.582: D/AndroidRuntime(942): Shutting down VM
08-19 19:49:06.582: W/dalvikvm(942): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
08-19 19:49:06.602: E/AndroidRuntime(942): FATAL EXCEPTION: main
08-19 19:49:06.602: E/AndroidRuntime(942): java.lang.RuntimeException: start failed.
08-19 19:49:06.602: E/AndroidRuntime(942):  at android.media.MediaRecorder.start(Native Method)
08-19 19:49:06.602: E/AndroidRuntime(942):  at com.example.callrecorder2.callreceiverservice$CallStateListener.onCallStateChanged(callreceiverservice.java:124)
08-19 19:49:06.602: E/AndroidRuntime(942):  at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:369)
08-19 19:49:06.602: E/AndroidRuntime(942):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-19 19:49:06.602: E/AndroidRuntime(942):  at android.os.Looper.loop(Looper.java:137)
08-19 19:49:06.602: E/AndroidRuntime(942):  at android.app.ActivityThread.main(ActivityThread.java:5041)
08-19 19:49:06.602: E/AndroidRuntime(942):  at java.lang.reflect.Method.invokeNative(Native Method)
08-19 19:49:06.602: E/AndroidRuntime(942):  at java.lang.reflect.Method.invoke(Method.java:511)
08-19 19:49:06.602: E/AndroidRuntime(942):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-19 19:49:06.602: E/AndroidRuntime(942):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-19 19:49:06.602: E/AndroidRuntime(942):  at dalvik.system.NativeStart.main(Native Method)

请帮助解决此错误,因为我已尝试过所有内容但运行时错误不会消失。

1 个答案:

答案 0 :(得分:0)

我能够使用实际手机通过Throwable Try来运行应用程序来记录通话,在其周围捕捉到阻止,错误仍然会发生,但我可以通过实际手机传递它。

try { recorder.start();
}catch (Throwable t) {
t.printStackTrace();
Log.w("TEST", t);

注意:在模拟器上,即使将try catch块与Throwable一起使用,呼叫接收也不起作用并继续发出错误。