@app.route('/', methods=['POST'])
def process_data():
req_data = request.get_json(force=True) # force=True will make sure this works even if a client does not specify application/json
language = req_data['language'] # or whatever key you have in your json
return '''The language value is: {}'''.format(language)
Необходимо будет найти URI сообщения. Но как только Вы делаете я думаю, что необходимо быть в состоянии к android.content. ContentResolver.delete (...) это.
Вот еще немного приблизительно информация .
Используя предложения от других, я думаю, что заставил его работать:
(использование SDK v1 R2)
Это не прекрасно, так как я должен удалить весь разговор, но в наших целях, это - достаточный компромисс, поскольку мы будем, по крайней мере, знать, что на все сообщения посмотрят и проверят. Наш поток должен будет, вероятно, тогда прислушаться к сообщению, получение для сообщения, которое мы хотим, сделайте запрос, чтобы получить thread_id недавно входящего сообщения и сделать удаление () вызов.
В нашем Действии:
Uri uriSms = Uri.parse("content://sms/inbox");
Cursor c = getContentResolver().query(uriSms, null,null,null,null);
int id = c.getInt(0);
int thread_id = c.getInt(1); //get the thread_id
getContentResolver().delete(Uri.parse("content://sms/conversations/" + thread_id),null,null);
Примечание: Я не смог сделать удаление на content://sms/inbox/или content://, SMS/все /
Похоже на поток, имеет приоритет, который имеет смысл, но сообщение об ошибке только ободрило меня, чтобы быть более сердитым. При попытке удаления на sms/inbox/или SMS/всем/, Вы, вероятно, доберетесь:
java.lang.IllegalArgumentException: Unknown URL
at com.android.providers.telephony.SmsProvider.delete(SmsProvider.java:510)
at android.content.ContentProvider$Transport.delete(ContentProvider.java:149)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:149)
Для дополнительной ссылки также, удостоверьтесь, что поместили это в свою декларацию для Вашего поглощенного получателя:
<receiver android:name=".intent.MySmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
</intent-filter>
</receiver>
Примечание тег получателя не похож на это:
<receiver android:name=".intent.MySmsReceiver"
android:permission="android.permission.RECEIVE_SMS">
, Когда у меня были те настройки, андроид дал мне некоторые сумасшедшие исключения полномочий, которые не позволили android.phone вручать от полученного SMS моему намерению. Так, НЕ помещайте это атрибут разрешения RECEIVE_SMS в Ваше намерение! Надо надеяться, кто-то более мудрый, чем я может сказать мне, почему это имело место.
Итак, у меня была игра, и можно удалить полученное SMS. К сожалению, не все гладко: (
У меня есть приемник, который принимает входящие SMS-сообщения. Теперь маршрутизация входящих SMS-сообщений Android работает так: фрагмент кода, отвечающий за декодирование сообщений, отправляет широковещательную рассылку (он использует sendBroadcast ()
- который, к сожалению, НЕ является версией, которая позволяет вам просто вызывать abortBroadcast ()
) всякий раз, когда приходит сообщение.
Мой получатель может быть вызван или не может быть вызван до Системный получатель SMS, и в любом случае полученная широковещательная рассылка не имеет свойства, которое могло бы отражать столбец _id
в таблице SMS.
Однако, не будучи тем, кого так легко остановить, я отправляю себя (через Handler) отложенное сообщение с SmsMessage в качестве прикрепленного объекта (я полагаю, вы тоже можете опубликовать себе Runnable ...)
handler.sendMessageDelayed(handler.obtainMessage(MSG_DELETE_SMS, msg), 2500);
Задержка необходима для того, чтобы к моменту прибытия сообщения все получатели широковещательной передачи завершили свою работу, и сообщение будет безопасно помещено в таблицу SMS.
Когда сообщение (или Runnable) будет получил вот что я делаю:
case MSG_DELETE_SMS:
Uri deleteUri = Uri.parse("content://sms");
SmsMessage msg = (SmsMessage)message.obj;
getContentResolver().delete(deleteUri, "address=? and date=?", new String[] {msg.getOriginatingAddress(), String.valueOf(msg.getTimestampMillis())});
Я использую исходный адрес и поле отметки времени, чтобы обеспечить очень высокую вероятность удаления ТОЛЬКО интересующего меня сообщения. Если бы я хотел быть еще более параноиком, я мог бы включить msg .getMessageBody ()
как часть запроса.
Да, сообщение удалено (ура!).
case MSG_DELETE_SMS:
Uri deleteUri = Uri.parse("content://sms");
SmsMessage msg = (SmsMessage)message.obj;
getContentResolver().delete(deleteUri, "address=? and date=?", new String[] {msg.getOriginatingAddress(), String.valueOf(msg.getTimestampMillis())});
Я использую исходный адрес и поле временной метки, чтобы обеспечить очень высокую вероятность удаления ТОЛЬКО того сообщения, которое меня интересует. Если бы я хотел быть еще более параноиком, я мог бы включить msg.getMessageBody ()
содержание как часть запроса.
Да, сообщение удалено (ура!).
case MSG_DELETE_SMS:
Uri deleteUri = Uri.parse("content://sms");
SmsMessage msg = (SmsMessage)message.obj;
getContentResolver().delete(deleteUri, "address=? and date=?", new String[] {msg.getOriginatingAddress(), String.valueOf(msg.getTimestampMillis())});
Я использую исходный адрес и поле временной метки, чтобы обеспечить очень высокую вероятность удаления ТОЛЬКО того сообщения, которое меня интересует. Если бы я хотел быть еще более параноиком, я мог бы включить msg.getMessageBody ()
содержание как часть запроса.
Да, сообщение удалено (ура!). К сожалению, панель уведомлений не обновляется: (
Когда вы открываете область уведомлений, вы видите сообщение, сидящее там для вас ... но когда вы нажимаете на нее, чтобы открыть, - его больше нет!
Чтобы мне, этого недостаточно - я хочу, чтобы все следы сообщения исчезли - я не хочу, чтобы пользователь думал, что есть TXT, когда его нет (это приведет только к сообщениям об ошибках).
Внутри ОС телефонные вызовы MessagingNotification.updateNewMessageIndicator (Context)
, но я этот класс был скрыт от API, и я не хотел реплицировать весь этот код только для того, чтобы сделать индикатор точным.
Я думаю, что пока это невозможно сделать идеально. Есть две основные проблемы:
Как убедиться, что смс уже находится в папке «Входящие», когда вы пытаетесь удалить его?
Обратите внимание, что SMS_RECEIVED не является заказанной рассылкой.
Итак, решение dmyung - это попытка удачи; даже задержка в ответе Дуга не является гарантией.
SmsProvider не является потокобезопасным. (см. http://code.google.com/p/android/issues/detail?id=2916#c0 )
Тот факт, что более одного клиента запрашивают удаление и вставку одновременно, вызовет повреждение данных или даже немедленное исключение времени выполнения.
Я не мог заставить его работать с помощью решения dmyung, оно вызывало исключение при получении идентификатора сообщения или идентификатор потока.
В конце концов, я использовал следующий метод, чтобы получить идентификатор потока:
private long getThreadId(Context context) {
long threadId = 0;
String SMS_READ_COLUMN = "read";
String WHERE_CONDITION = SMS_READ_COLUMN + " = 0";
String SORT_ORDER = "date DESC";
int count = 0;
Cursor cursor = context.getContentResolver().query(
SMS_INBOX_CONTENT_URI,
new String[] { "_id", "thread_id", "address", "person", "date", "body" },
WHERE_CONDITION,
null,
SORT_ORDER);
if (cursor != null) {
try {
count = cursor.getCount();
if (count > 0) {
cursor.moveToFirst();
threadId = cursor.getLong(1);
}
} finally {
cursor.close();
}
}
return threadId;
}
Затем я мог его удалить. Однако, как сказал Дуг, уведомление все еще есть, даже если сообщение отображается при открытии панели уведомлений. Только при нажатии на сообщение я действительно увидел, что оно пустое.
Так что, я думаю, единственный способ, которым это сработает, - это как-то перехватить SMS перед этим » доставляется в систему еще до того, как попадет в почтовый ящик. Однако я очень сомневаюсь, что это выполнимо. Пожалуйста, поправьте меня, если я ошибаюсь.
Просто отключите уведомления для приложения смс по умолчанию. Обрабатывайте собственные уведомления для всех текстовых сообщений!