Почему мое MMS зависает в состоянии «Отправка» и не отправляется?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Почему мое MMS зависает в состоянии «Отправка» и не отправляется?

Сообщение Anonymous »

Я создаю приложение, которое работает как приложение для обмена SMS-сообщениями по умолчанию. Я использую библиотеку klinker41/android-smsmms для отправки сообщений и реализовал ее так же, как и этот проект Simple-SMS-Messanger
Но проблема в том, что отправка Mms работает на каком-то устройстве, а на каком-то нет.
Некоторые такие устройства:
realme 9i android 13 network – vi
samesung m53 android 13 network - jio
redmi note10s android 13 network - jio
Возникают проблемы, например, Mms зависает при «отправке» и не дает ответа любые коды ошибок, но некоторые другие устройства выдают «код ошибки: 5».
В библиотеке klinker41 открыто и не решено много проблем, поэтому мне нужен кто-то, кто поможет мне найти другой подход или расскажет, как это сделать. исправьте
Вот мой код
Это настройки библиотеки Klinker41, которую я использую

Код: Выделить всё

fun Context.getSendMessageSettings(): Settings {
val settings = Settings()
settings.useSystemSending = true
settings.deliveryReports = config.enableDeliveryReports
settings.sendLongAsMms = config.sendLongMessageMMS
settings.sendLongAsMmsAfter = 1
settings.group = config.sendGroupMessageMMS
return settings
}
Эта функция принимает каждое выбранное вложение и отправляет его как Mms-сообщение

Код: Выделить всё

/** Sends the message using the in-app SmsManager API wrappers if it's an SMS or using android-smsmms for MMS.  */
fun Context.sendMessageCompat(text: String, addresses: List, subId: Int?, attachments: List, messageId: Long? = null) {
val settings = getSendMessageSettings()
if (subId != null) {
settings.subscriptionId = subId
}
Log.i("subId", subId.toString())

val messagingUtils = messagingUtils
val isMms = attachments.isNotEmpty() || isLongMmsMessage(text, settings) || addresses.size > 1 && settings.group
if (isMms) {
// we send all MMS attachments separately to reduces the chances of hitting provider MMS limit.
if (attachments.isNotEmpty()) {
val lastIndex = attachments.lastIndex
if (attachments.size > 1) {
for (i in 0 until lastIndex) {
val attachment = attachments[i]
messagingUtils.sendMmsMessage("", addresses, attachment, settings, messageId)
}
}

val lastAttachment = attachments[lastIndex]
messagingUtils.sendMmsMessage(text, addresses, lastAttachment, settings, messageId)
} else {
messagingUtils.sendMmsMessage(text, addresses, null, settings, messageId)
}
} else {
try {
messagingUtils.sendSmsMessage(text, addresses.toSet(), settings.subscriptionId, settings.deliveryReports, messageId)
} catch (e: SmsException) {
when (e.errorCode) {
EMPTY_DESTINATION_ADDRESS -> toast(id = R.string.empty_destination_address, length = LENGTH_LONG)
ERROR_PERSISTING_MESSAGE -> toast(id = R.string.unable_to_save_message, length = LENGTH_LONG)
ERROR_SENDING_MESSAGE ->  toast(
msg = getString(R.string.unknown_error_occurred_sending_message, e.errorCode),
length = LENGTH_LONG
)
}
} catch (e: Exception) {
showErrorToast(e)
}
}
}
Это функция, которая вызывает транзакцию sendNewMessage

Код: Выделить всё

fun sendMmsMessage(text: String, addresses: List, attachment: Attachment?, settings: Settings, messageId: Long? = null) {
val transaction = Transaction(context, settings)
val message = Message(text, addresses.toTypedArray())

if (attachment != null) {
try {
val uri = attachment.getUri()
context.contentResolver.openInputStream(uri)?.use {
val bytes = it.readBytes()
val mimeType = if (attachment.mimetype.isPlainTextMimeType()) {
"application/txt"
} else {
attachment.mimetype
}
val name = attachment.filename
message.addMedia(bytes, mimeType, name)
}
} catch (e: Exception) {
context.showErrorToast(e)
} catch (e: Error) {
context.showErrorToast(e.localizedMessage ?: context.getString(com.simplemobiletools.commons.R.string.unknown_error_occurred))
}
}

val mmsSentIntent = Intent(context, MmsSentReceiver::class.java)
mmsSentIntent.putExtra(MmsSentReceiver.EXTRA_ORIGINAL_RESENT_MESSAGE_ID, messageId)
transaction.setExplicitBroadcastForSentMms(mmsSentIntent)

try {
transaction.sendNewMessage(message)
} catch (e: Exception) {
context.showErrorToast(e)
}
}
Это получатель, который мы передаем библиотеке для вызова получателя, когда сообщение отправлено или не удалось отправить

Код: Выделить всё

@AndroidEntryPoint
class MmsSentReceiver : SendStatusReceiver() {
@Inject
lateinit var cache: Cache
private val myCoroutineScope = CoroutineScope(Dispatchers.IO)

override fun updateAndroidDatabase(context: Context, intent: Intent, receiverResultCode: Int) {
val uri = Uri.parse(intent.getStringExtra(EXTRA_CONTENT_URI))
val originalResentMessageId = intent.getLongExtra(EXTRA_ORIGINAL_RESENT_MESSAGE_ID, -1L)
val messageBox = if (receiverResultCode == Activity.RESULT_OK) {
Telephony.Mms.MESSAGE_BOX_SENT
} else {
val msg = context.getString(R.string.unknown_error_occurred_sending_message, receiverResultCode)
context.toast(msg = msg, length = Toast.LENGTH_LONG)

Telephony.Mms.MESSAGE_BOX_FAILED
}

val values = ContentValues(1).apply {
put(Telephony.Mms.MESSAGE_BOX, messageBox)
}

try {
context.contentResolver.update(uri, values, null, null)
} catch (e: SQLiteException) {
context.showErrorToast(e)
}

// In case of resent message, delete original to prevent duplication
if (originalResentMessageId != -1L) {
myCoroutineScope.launch {
context.deleteMessage(originalResentMessageId, true)
cache.deleteMessage(originalResentMessageId)
}
}

val filePath = intent.getStringExtra(EXTRA_FILE_PATH)
if (filePath != null) {
File(filePath).delete()
}
}

override fun updateAppDatabase(context: Context, intent: Intent, receiverResultCode: Int) {
val messageUri: Uri? = intent.data
if (messageUri != null) {
val messageId = messageUri.lastPathSegment?.toLong() ?: 0L
myCoroutineScope.launch {
if (resultCode != Telephony.Sms.Sent.STATUS_NONE) {
cache.updateMessageStatus(messageId, receiverResultCode)
}
}
}
}

companion object {
private const val EXTRA_CONTENT_URI = "content_uri"
private const val EXTRA_FILE_PATH = "file_path"
const val EXTRA_ORIGINAL_RESENT_MESSAGE_ID = "original_message_id"
}
}
Приложение отправляет SMS нормально, без проблем, но основная проблема связана с MMS.
Я убедился, что на устройстве есть стабильное соединение для передачи данных 4G. , настройки MMS верны и приложение имеет необходимые разрешения. Я также протестировал приложение для обмена сообщениями по умолчанию на том же устройстве, и оно без проблем отправляет MMS. Я просмотрел свой код и вообще не смог найти проблему. Проблема также есть в проекте Simple-SMS-Messanger, но не решена разработчиками.

Подробнее здесь: https://stackoverflow.com/questions/786 ... being-sent
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»