主要活动代码
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.i("ListenerTag","onCreate")
创建用于存储录制的目录
val folder =
File(Environment.getExternalStorageDirectory().toString() +
"/Recording")
var success = true
if (!folder.exists()) {
//Toast.makeText(MainActivity.this, "Directory Does Not Exist,
Create It", Toast.LENGTH_SHORT).show();
success = folder.mkdir();
}
调用CallListener类
val tManager = getSystemService(Context.TELEPHONY_SERVICE) as
TelephonyManager
val callListener = CallListener()
tManager.listen(callListener, PhoneStateListener.LISTEN_CALL_STATE)
}
}
调用侦听器类
class CallListener: PhoneStateListener() {
val LOG_TAG="ListenerTag"
var mediaRecorder: MediaRecorder? = null
lateinit var audioFilePath: String
var isRecording = false
var isUpload=false
在手机状态发生变化时调用
override fun onCallStateChanged(state: Int, incomingNumber: String) {
在电话响铃时呼叫
if (TelephonyManager.CALL_STATE_RINGING == state) {
Log.i(LOG_TAG, "RINGING, number: $incomingNumber")
}
呼叫处于活动状态时调用
if (TelephonyManager.CALL_STATE_OFFHOOK == state) {
Log.i(LOG_TAG, "OFFHOOK")
Log.i("ListenerTag",incomingNumber)
mediaRecorder= MediaRecorder()
Log.i(LOG_TAG,"Media Recorder Initi")
mediaRecorder?.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL)
Log.i(LOG_TAG,"Audio Source Set")
mediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
Log.i(LOG_TAG,"Audio Format Set")
val sdf = SimpleDateFormat("dd_M_yyyy_hh:mm")
val currentDate = sdf.format(Date()).toString()
audioFilePath=Environment.getExternalStorageDirectory().absolutePath
+"/Recording/audio_"+currentDate+".amr"
mediaRecorder?.setOutputFile(audioFilePath)
Log.i(LOG_TAG,"File Path Set")
mediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
Log.i(LOG_TAG,"Encoder Set")
mediaRecorder?.prepare()
Log.i(LOG_TAG,"MediaRecorder Prepared")
Thread.sleep(2000)
mediaRecorder?.start()
Log.i(LOG_TAG,"MediaRecorder Started")
isRecording = true;
isUpload=true
}
if (TelephonyManager.CALL_STATE_IDLE == state ) {
//when this state occurs, and your flag is set, restart your app
Log.i(LOG_TAG, "IDLE")
mediaRecorder?.stop()
Log.i(LOG_TAG, "MediaRecorder Stooped")
mediaRecorder?.reset()
Log.i(LOG_TAG, "MediaRecorder Reset")
mediaRecorder?.release()
Log.i(LOG_TAG, "MediaRecorder Release")
isRecording = false
当此firebase代码不存在时,应用程序运行良好,但当代码存在时,应用程序仅发送一次录制,然后应用程序停止工作
if(isUpload==true){
mStorageRef = FirebaseStorage.getInstance().getReference();
var firebaseFilePath =
mStorageRef.child("Audio").child(audioFilePath)
var uri = Uri.fromFile(File(audioFilePath))
firebaseFilePath.putFile(uri)
.addOnSuccessListener(OnSuccessListener<UploadTask.TaskSnapshot>
{ taskSnapshot ->
// Get a URL to the uploaded content
val downloadUrl = taskSnapshot.downloadUrl
})
.addOnFailureListener(OnFailureListener {
// Handle unsuccessful uploads
// ...
})
Log.i(LOG_TAG,"Upload fun end")
isUpload=false
}
}
}