2014-01-14 1 views
2

Кто-нибудь знает, почему я всегда получаю параметр date_sent как «0», вместо правильной информации при отправке сообщения? (Я получаю 0 для отправленных или полученных сообщений, но, насколько я помню, у обоих, отправленных и полученных, есть отдельное время в приложении для акций, так что, безусловно, доступна эта информация, просто не понимаю, почему я не могу получить это запрос «date_sent» ... Он предлагается на многих сайтах, но всегда возвращает ноль.SMS-сообщения date_sent на Android с Delphi XE5 всегда возвращают 0?

Есть ли более новая информация о доступе к android api? Я нашел несколько информации, но все довольно старые и говорит, что обмен сообщениями не документировано никогда ничего не изменилось с тех пор ли это https://stackoverflow.com/a/6446831/1786516 все, что есть о мм, или есть Дельфи xe5 пример уже сделал

UPDATE:.?

Вот пример происхождения код для чтения SMS-сообщения в Delphi xe5, как это предусмотрено на нескольких страницах:

uses 
    SysUtils, 
    FMX.Helpers.Android, 
    Androidapi.JNI.GraphicsContentViewText, 
    Androidapi.JNI.Net, 
    Androidapi.JNI.JavaTypes, 
    Androidapi.JNI.Telephony; 

function ReadSMSInbox:string; 
var 
    cursor: JCursor; 
    uri: Jnet_Uri; 
    address,person,msgdatesent,protocol,msgread,msgstatus,msgtype, 
    msgreplypathpresent,subject,body, 
    servicecenter,locked:string; 
    msgunixtimestampms:int64; 
begin 
    uri:=StrToJURI('content://sms/inbox'); 
    cursor := SharedActivity.getContentResolver.query(uri, nil, nil,nil,nil); 

    while (cursor.moveToNext) do begin 
    address:=JStringToString(cursor.getString(cursor.getColumnIndex(StringToJstring('address')))); 
    person:=JStringToString(cursor.getString(cursor.getColumnIndex(StringToJstring('person')))); 
    msgunixtimestampms:=cursor.getLong(cursor.getColumnIndex(StringToJstring('date'))); 
    msgdatesent:=JStringToString(cursor.getString(cursor.getColumnIndex(StringToJstring('date_sent')))); 
    protocol:=JStringToString(cursor.getString(cursor.getColumnIndex(StringToJstring('protocol')))); 
    msgread:=JStringToString(cursor.getString(cursor.getColumnIndex(StringToJstring('read')))); 
    msgstatus:=JStringToString(cursor.getString(cursor.getColumnIndex(StringToJstring('status')))); 
    msgtype:=JStringToString(cursor.getString(cursor.getColumnIndex(StringToJstring('type')))); 
    msgreplypathpresent:=JStringToString(cursor.getString(cursor.getColumnIndex(StringToJstring('reply_path_present')))); 
    subject:=JStringToString(cursor.getString(cursor.getColumnIndex(StringToJstring('subject')))); 
    body:=JStringToString(cursor.getString(cursor.getColumnIndex(StringToJstring('body')))); 
    servicecenter:=JStringToString(cursor.getString(cursor.getColumnIndex(StringToJstring('service_center')))); 
    locked:=JStringToString(cursor.getString(cursor.getColumnIndex(StringToJstring('locked')))); 
    Result:=IntToStr(trunc(msgunixtimestampms/1000))+' '+address+' '+body; //+whatever you want to add here; 
StringList1.Add(Result); //Add the result in stringlist to collect all of them 
    end; 
end; 

Существует абсолютно тот же код для чтения Исходящие (Sent) SMS-сообщений, за исключением того, что имя функции ReadSMSOutbox, и строка uri равна uri:=StrToJURI('content://sms/sent');

См. ответ на измененный/оптимизированный код и решение о исправленных запросах date_sent.

+0

Вы абсолютно не указали код, поэтому нам невозможно рассказать вам, почему вы получаете результаты, которые получаете. Ожидаете ли вы, что мы читаем ваш ум или видим ваш экран, где мы находимся? –

+0

Нет, но я, однако, ожидаю, что получу только ответы и ответы от людей, которые уже знают, о чем я говорю, и что такое код. Потому что я верю, что из моего вопроса есть клерикально сказано, что я знаю, что я делаю (для этого конкретного случая, иначе я просто полный новичок, это точно !!), и что это не проблема в моей или какой-либо конкретный код, но в самих значениях. У меня нет ошибок чтения, параметр «date_sent» существует в базе данных Android, я получаю значение, но он всегда равен 0, а это значит, что сам андроид заполняет базу данных –

+0

значением по умолчанию, равным 0. Итак, еще раз, я не думаю, что код здесь является необязательным, поскольку он был опубликован много раз по всему, и я никогда не намерен делать только один дубликат и получать ответ «вы делаете это правильно. Если это то, что вы получаете, то это то, что есть в базе данных. Никакой помощи. " Я уже знаю, что. Мой вопрос: ПОЧЕМУ это происходит, и КАК получить правильные значения, которые явно НЕ относятся к параметру date_sent, поэтому вопрос был также (как мой второй параграф), есть ли какие-либо ДРУГИЕ запросы, которые известны, и есть ли в наличии новый документ –

ответ

3

Итак, проведя несколько часов в Интернете, не найдя ничего интересного, я начал рассказывать о своем телефоне и расширять файл базы данных для сообщений smsmms.db, в котором я нашел таблицу/sms, которую я Явный доступ для получения сообщений.

В таблице есть, наряду со всеми столбцами, которые уже «известны» для чтения сообщений, еще несколько, для меня интересными были даты. Поэтому я попытался использовать запрос для столбца «date2» и «report_date».

Таким образом, вместо того, чтобы использовать date_sent, который явно ничего не восстановить на всех, вы должны использовать date2 для входящих (полученных сообщения, типа = 1), в то время как для исходящих сообщений (посланных, типа = 2), вы должны использовать «report_date». Кажется, что он извлекает именно то, что ему нужно, правильную дату, когда полученное сообщение было первоначально отправлено, и когда отправленное сообщение было доставлено.

date_sent поэтому может быть исключен из запроса, хотя он существует.

Я не совсем уверен, относится ли это ко всем версиям Android, но это подтверждается для всех 4.x вверх (+).

Будет проверяться на 2.2 и 2.3 в ближайшие несколько дней и обновить свой ответ с подтверждением.

Кроме того, приложение рынка «Sms резервного & Восстановление», который является довольно популярным для выполнения смс резервного копирования (более или менее читаемый формат XML делает его прекрасным для разницы других приложений), кажется, использует date_sent, а также , вместо date2 и report_date.

Я не совсем уверен, если это вообще возможно использовать при запросе обоих Входящие и сходящие сообщения сразу, без запроса обоих столбцов для обоих типов сообщений, который дает вам дополнительный параметр для читать; Я использую inbox ant исходящие запросы в отдельных функциях, поэтому я использую также отделенные даты.

Я надеюсь, что это поможет любому, так как он нигде не был покрыт.

ОБНОВЛЕНИЕ:

Вот пример кода, оптимизированный для скорости, так как Lars Don his website при условии,

(смотрите раздел с addressidx и других целочисленных значений, его код обеспечивает индексы столбцов перед , чтобы иметь фиксированные данные, так как этот запрос уже знает, какой столбец читается каждый раз, когда курсор переходит к «следующему», вместо того, чтобы каждый раз указывать индекс столбца каждый раз в курсорном запросе, как это было предложено множеством примеров Java; Это решение должно быть немного быстрее выполнить!)

uses 
    SysUtils, 
    FMX.Helpers.Android, 
    Androidapi.JNI.GraphicsContentViewText, 
    Androidapi.JNI.Net, 
    Androidapi.JNI.JavaTypes, 
    Androidapi.JNI.Telephony; 

function ReadSMSInbox:string; 
// function ReadSMSOutbox:string; // for reading outbox 
var 
    cursor: JCursor; 
    uri: Jnet_Uri; 
    address,person,msgdatesent,protocol,msgread,msgstatus,msgtype, 
    msgreplypathpresent,subject,body, 
    servicecenter,locked      :string; 
    msgunixtimestampms       :int64; 
// here are new integer variables 
    addressidx,personidx,msgdateidx,msgdatesentidx,protocolidx,msgreadidx, 
    msgstatusidx,msgtypeidx,msgreplypathpresentidx,subjectidx,bodyidx, 
    servicecenteridx,lockedidx     :integer; 
begin 
    uri:=StrToJURI('content://sms/inbox'); 
// uri:=StrToJURI('content://sms/sent'); // use this for outbox messages! 

    cursor := SharedActivity.getContentResolver.query(uri, nil, nil,nil,nil); 
// here we get column indexes in advance !!! 

    addressidx:=cursor.getColumnIndex(StringToJstring('address')); 
    personidx:=cursor.getColumnIndex(StringToJstring('person')); 
    msgdateidx:=cursor.getColumnIndex(StringToJstring('date')); //this is actual date, always the same; you may need/use this as main date; 

    msgdatesentidx:=cursor.getColumnIndex(StringToJstring('date2')); //this is the actual sent date/time, note this different column used!!! 

    //msgdatesentidx:=cursor.getColumnIndex(StringToJstring('report_date')); 
    //this is the actual delivery date/time, (when your message was actually delivered to the recepient! 
    // Note this different column used as well!!! 


    protocolidx:=cursor.getColumnIndex(StringToJstring('protocol')); 
    msgreadidx:=cursor.getColumnIndex(StringToJstring('read')); 
    msgstatusidx:=cursor.getColumnIndex(StringToJstring('status')); 
    msgtypeidx:=cursor.getColumnIndex(StringToJstring('type')); 
    msgreplypathpresentidx:=cursor.getColumnIndex(StringToJstring('reply_path_present')); 
    subjectidx:=cursor.getColumnIndex(StringToJstring('subject')); 
    bodyidx:=cursor.getColumnIndex(StringToJstring('body')); 
    servicecenteridx:=cursor.getColumnIndex(StringToJstring('service_center')); 
    lockedidx:=cursor.getColumnIndex(StringToJstring('locked')); 

// now the query 

    while (cursor.moveToNext) do begin 
    address:=JStringToString(cursor.getString(addressidx)); 
    person:=JStringToString(cursor.getString(personidx)); 
    msgunixtimestampms:=cursor.getLong(msgdateidx); 
    msgdatesent:=JStringToString(cursor.getString(msgdatesentidx)); 
    protocol:=JStringToString(cursor.getString(protocolidx)); 
    msgread:=JStringToString(cursor.getString(msgreadidx)); 
    msgstatus:=JStringToString(cursor.getString(msgstatusidx)); 
    msgtype:=JStringToString(cursor.getString(msgtypeidx)); 
    msgreplypathpresent:=JStringToString(cursor.getString(msgreplypathpresentidx)); 
    subject:=JStringToString(cursor.getString(subjectidx)); 
    body:=JStringToString(cursor.getString(bodyidx)); 
    servicecenter:=JStringToString(cursor.getString(servicecenteridx)); 
    locked:=JStringToString(cursor.getString(lockedidx)); 

    Result:=IntToStr(trunc(msgunixtimestampms/1000))+' '+address+' '+body; //+whatever you want to add here; 
StringList1.Add(Result); //Add the result in stringlist to collect all of them 

    end; 
end; 

Опять же, для получения Исходящие (отправляемые) сообщения, вы можете использовать ту же самую функцию, только переименовать его в нечто вроде ReadSMSOutbox, + вам нужно изменить Ури к uri:=StrToJURI('content://sms/sent');, как это предусмотрено внутри кода выше как комментарий, однако здесь date2 здесь НЕ ОК. Для исходящих сообщений вы должны использовать report_date для получения правильного индекса столбца, а также его в комментарии к коду.

Проверено на 2.2, 2.3, 4.0, 4.2 и 4.3, и оно корректно работает во всех этих версиях Android. Похоже, это правильный выбор. :)

Удачи вам в ваших приложениях! :)

Для получения кода MMS, отправьте комментарий, если вам нужен код. Это совсем другая история ...

+1

+1 для вашей работы и совместного использования, и было бы даже лучше, если бы вы поделились некоторым примером кода. – Arnold

+0

Сделай это прямо сейчас! –

+0

Отличная работа! И спасибо за ссылку на Lars D. Вам может быть интересна статья Брайана Лонга, в которой он описывает, как реализовать BroadcastReceivers (http://blog.blong.com/2013/11/delphi-and-android-services- неполный 2.html). Вам понадобится, если вы хотите получать SMS-сообщения (я знаю, это другая тема, но отправка приводит к получению :-) – Arnold

 Смежные вопросы

  • Нет связанных вопросов^_^