SharedPrefs в receiver
В общем,есть receiver для обнаружения звонков. В нем мне нужно создать sharedPreference и сохранить данные. Проблема в том что если я это делаю в activity или service то всё хорошо, но если здесь то оно ничего не сохраняет. Как правильно это сделать? может не тот context?
Заранее спасибо.
Вот код ресивера:
package com.example.callrecorder.receiver
///imports
open class CallRecordReceiver(private var callRecord: CallRecord, private val context: Context) : PhoneCallReceiver() {
companion object {
private val TAG = CallRecordReceiver::class.java.simpleName
const val ACTION_IN = "android.intent.action.PHONE_STATE"
const val ACTION_OUT = "android.intent.action.NEW_OUTGOING_CALL"
const val EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER"
private var recorder: MediaRecorder? = null
}
private var audioFile: File? = null
private var isRecordStarted = false
override fun onIncomingCallReceived(context: Context, number: String?, start: Date) {
}
override fun onIncomingCallAnswered(context: Context, number: String?, start: Date) {
val prefs = android.preference.PreferenceManager.getDefaultSharedPreferences(context)
val editor = prefs.edit()
editor.putBoolean("ring", true)
editor.apply()
startRecord(context, "incoming_"+System.currentTimeMillis(), number)
}
override fun onIncomingCallEnded(context: Context, number: String?, start: Date, end: Date) {
val prefs = android.preference.PreferenceManager.getDefaultSharedPreferences(context)
val editor = prefs.edit()
editor.putBoolean("ring", false)
editor.apply()
stopRecord(context)
}
override fun onOutgoingCallStarted(context: Context, number: String?, start: Date) {
val prefs = android.preference.PreferenceManager.getDefaultSharedPreferences(context)
val editor = prefs.edit()
editor.putBoolean("ring", true)
editor.apply()
startRecord(context, "outgoing_"+System.currentTimeMillis(), number)
}
override fun onOutgoingCallEnded(context: Context, number: String?, start: Date, end: Date) {
val prefs = android.preference.PreferenceManager.getDefaultSharedPreferences(context)
val editor = prefs.edit()
editor.putBoolean("ring", false)
editor.apply()
stopRecord(context)
}
override fun onMissedCall(context: Context, number: String?, start: Date) {
val cal = Calendar.getInstance()
cal.time = start
val millis = cal.timeInMillis
writemissedcall(number.toString(),millis.toString(),context)
}
// Derived classes could override these to respond to specific events of interest
protected open fun onRecordingStarted(context: Context, callRecord: CallRecord, audioFile: File?) {}
protected open fun onRecordingFinished(context: Context, callRecord: CallRecord, audioFile: File?) {}
private fun startRecord(context: Context, seed: String, phoneNumber: String?) {
try {
val isSaveFile = PrefsHelper.readPrefBool(context, CallRecord.PREF_SAVE_FILE)
LogUtils.i(TAG, "isSaveFile: $isSaveFile")
// is save file?
if (!isSaveFile) {
return
}
if (isRecordStarted) {
LogUtils.i(TAG, "One")
try {
LogUtils.i(TAG, "two")
//recorder?.stop() // stop the recording
stopRecord(context)
startRecord(context, seed, phoneNumber)
} catch (e: RuntimeException) {
LogUtils.i(TAG, "Three")
// RuntimeException is thrown when stop() is called immediately after start().
// In this case the output file is not properly constructed ans should be deleted.
LogUtils.d(TAG, "RuntimeException: stop() is called immediately after start()")
audioFile?.delete()
}
releaseMediaRecorder()
isRecordStarted = false
} else {
LogUtils.i(TAG, "Four")
if (prepareAudioRecorder(context, seed, phoneNumber)) {
recorder!!.start()
isRecordStarted = true
onRecordingStarted(context, callRecord, audioFile)
LogUtils.i(TAG, "record start")
} else {
LogUtils.i(TAG, "Five")
releaseMediaRecorder()
}
}
} catch (e: IllegalStateException) {
e.printStackTrace()
releaseMediaRecorder()
} catch (e: RuntimeException) {
e.printStackTrace()
releaseMediaRecorder()
} catch (e: Exception) {
e.printStackTrace()
releaseMediaRecorder()
}
}
private fun stopRecord(context: Context) {
LogUtils.i(TAG, "record stop 1")
try {
if (recorder != null && isRecordStarted) {
releaseMediaRecorder()
isRecordStarted = false
onRecordingFinished(context, callRecord, audioFile)
LogUtils.i(TAG, "record stop 2")
}
} catch (e: Exception) {
releaseMediaRecorder()
e.printStackTrace()
}
}
private fun prepareAudioRecorder(
context: Context, seed: String, phoneNumber: String?
): Boolean {
try {
var fileName = PrefsHelper.readPrefString(context, CallRecord.PREF_FILE_NAME)
val dirPath = PrefsHelper.readPrefString(context, CallRecord.PREF_DIR_PATH)
val dirName = PrefsHelper.readPrefString(context, CallRecord.PREF_DIR_NAME)
val showSeed = PrefsHelper.readPrefBool(context, CallRecord.PREF_SHOW_SEED)
val showPhoneNumber =
PrefsHelper.readPrefBool(context, CallRecord.PREF_SHOW_PHONE_NUMBER)
val outputFormat = PrefsHelper.readPrefInt(context, CallRecord.PREF_OUTPUT_FORMAT)
val audioSource = PrefsHelper.readPrefInt(context, CallRecord.PREF_AUDIO_SOURCE)
val audioEncoder = PrefsHelper.readPrefInt(context, CallRecord.PREF_AUDIO_ENCODER)
val sampleDir = File("$dirPath/$dirName")
if (!sampleDir.exists()) {
sampleDir.mkdirs()
}
val fileNameBuilder = StringBuilder()
fileNameBuilder.append(fileName)
fileNameBuilder.append("_")
if (showSeed) {
fileNameBuilder.append(seed)
fileNameBuilder.append("_")
}
if (showPhoneNumber && phoneNumber != null) {
fileNameBuilder.append(phoneNumber)
fileNameBuilder.append("_")
}
fileName = fileNameBuilder.toString()
val suffix: String
when (outputFormat) {
MediaRecorder.OutputFormat.AMR_NB -> {
suffix = ".amr"
}
MediaRecorder.OutputFormat.AMR_WB -> {
suffix = ".amr"
}
MediaRecorder.OutputFormat.MPEG_4 -> {
suffix = ".mp4"
}
MediaRecorder.OutputFormat.THREE_GPP -> {
suffix = ".3gp"
}
else -> {
suffix = ".amr"
}
}
audioFile = File.createTempFile(fileName, suffix, sampleDir)
recorder = MediaRecorder()
recorder?.apply {
setAudioSource(audioSource)
setOutputFormat(outputFormat)
setAudioEncoder(audioEncoder)
setOutputFile(audioFile!!.absolutePath)
setOnErrorListener { _, _, _ -> }
}
try {
recorder?.prepare()
} catch (e: IllegalStateException) {
LogUtils.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.message)
releaseMediaRecorder()
return false
} catch (e: IOException) {
LogUtils.d(TAG, "IOException preparing MediaRecorder: " + e.message)
releaseMediaRecorder()
return false
}
return true
} catch (e: Exception) {
LogUtils.e(e)
e.printStackTrace()
return false
}
}
private fun releaseMediaRecorder() {
recorder?.apply {
reset()
release()
}
recorder = null
}
private fun writemissedcall(num: String, time: String, context: Context) {
println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
println("!$num!$time!")
val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
val call: String
call = "!$num@$time?"
val editor: SharedPreferences.Editor = prefs.edit()
editor.putString("missedcalls", call)
editor.apply()
}
}
Ответы (1 шт):
Автор решения: sapeg
→ Ссылка
По логике настройки сохраняются, чтобы при перезапуске приложения они не исчезали. Следовательно записывать их надо в onSaveInstanceState, а считывать в onRestoreInstanceState.