Вылетает приложение при попытке доступа к SharedPreference из BroadcastReceiver
Вообщем, такая проблема, решил было сделать себе приложение, суть которого проста - есть 3 поля для ввода 3 параметров, а именно - API, Key и Numbers. Для ловли смс нашел примерчик в интернете. Все вставил, работало. Так как BroadcastReceiver находится в отдельном файле, было сложно найти хоть что-то, что помогло бы передать 3 параметра в файл с ловителем смс. Наткнулся на SharedPreference и используя пример попытался передать данные в ресивер. Оформил передачу в референсы тестового числа из onCreate. Студио все билдит, но при получении СМС приложение вылетает. Код ошибки:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: ru.loreinc.smshandler, PID: 2615
java.lang.RuntimeException: Unable to start receiver ru.loreinc.smshandler.MyReceiver: android.content.res.Resources$NotFoundException: String resource ID #0x7d8a2d7f
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3194)
at android.app.ActivityThread.-wrap17(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1672)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x7d8a2d7f
at android.content.res.Resources.getText(Resources.java:339)
at android.widget.Toast.makeText(Toast.java:304)
at ru.loreinc.smshandler.MyReceiver.onReceive(MyReceiver.kt:46)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3187)
----------------
MainActivity.kt:
package ru.loreinc.smshandler
import android.Manifest
import android.content.Context
import android.content.SharedPreferences
import android.content.pm.PackageManager
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
class MainActivity : AppCompatActivity() {
private var sharedPrefs: SharedPreferences? = null
var ed: SharedPreferences.Editor? = null
val PREF = "myprefs"
val COLOR_PREF = "colorPref"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
sharedPrefs = getSharedPreferences(PREF, Context.MODE_PRIVATE);
ed = sharedPrefs?.edit();
ed?.putInt(COLOR_PREF, 88005553535.toInt());
ed?.apply();
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECEIVE_SMS)) {
} else {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.RECEIVE_SMS), MY_PERMISSIONS_REQUEST_RECEIVE_SMS)
}
}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
when (requestCode) {
MY_PERMISSIONS_REQUEST_RECEIVE_SMS -> {
if (grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "SMS permission granted. \nApp is ready for use.", Toast.LENGTH_LONG)
} else {
Toast.makeText(this, "SMS permission denied. \nApp can't work without it.", Toast.LENGTH_LONG)
}
}
}
}
companion object {
private const val MY_PERMISSIONS_REQUEST_RECEIVE_SMS = 0
}
fun startApp(view: View?) {
ed?.putInt(COLOR_PREF, 88005553535.toInt());
ed?.apply();
}
}
MyReceiver.kt:
package ru.loreinc.smshandler
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.os.Build
import android.telephony.SmsMessage
import android.util.Log
import android.widget.Toast
class MyReceiver : BroadcastReceiver() {
var msg: String? = null
var phoneNo: String? = ""
var sharedPrefs: SharedPreferences? = null
var ed: SharedPreferences.Editor? = null
val PREF = "myprefs"
val COLOR_PREF = "colorPref"
override fun onReceive(context: Context, intent: Intent) {
sharedPrefs = context.getSharedPreferences(PREF, Context.MODE_PRIVATE)
Log.i(TAG, "Intent Received: " + intent.action)
if (intent.action === SMS_RECEIVED) {
val dataBundle = intent.extras
if (dataBundle != null) {
val mypdu = dataBundle["pdus"] as Array<*>?
val message = arrayOfNulls<SmsMessage>(mypdu!!.size)
for (i in mypdu.indices) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val format = dataBundle.getString("format")
message[i] = SmsMessage.createFromPdu(mypdu[i] as ByteArray, format)
} else {
message[i] = SmsMessage.createFromPdu(mypdu[i] as ByteArray)
}
msg = message[i]?.getMessageBody()
phoneNo = message[i]?.getOriginatingAddress()
}
val theme = sharedPrefs!!.getInt(COLOR_PREF, 0)
Toast.makeText(context, theme, Toast.LENGTH_LONG).show()
}
}
}
companion object {
private const val SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"
private const val TAG = "SmsBroadcastReceiver"
}
}
Ребят, молю вас, помогите. Все нервы на этот Android Studio исчерпал, уж очень сложно найти нормальные примеры того, что мне необходимо. Я не прошу вас сделать все за меня, просто ткните меня носов в ошибку и помогите ее решить :]
Ответы (1 шт):
Toast.makeText(context, theme, Toast.LENGTH_LONG).show()
theme - инт?
мб там стринга нужна?