2015-12-29 3 views
0

Я был бы признателен за помощь в поиске рабочего кода для чтения смс-сообщений на android kitkat. Я знаю, что приложение должно быть стандартным sms-приложением с соответствующими разрешениями. Я действительно не хочу раздражать пользователя любым всплывающим диалоговым окном, запрашивающим, чтобы пользователь вручную выбирал приложение sms по умолчанию. Я хотел бы, чтобы мое приложение выполнялось как sms по умолчанию, пока его задача не будет завершена, а затем верните настройку к исходному sms, установленному пользователем или фабрикой, перед использованием моего приложения.Как прокомментировать sms-сообщения от android kitkat Delphi XE8

В настоящее время я НЕ МОЖЕТ показать любые sms-сообщения и не могу понять, почему. Тем не менее, я вижу, что мое приложение включено в список стандартных приложений sms на устройстве тестирования.

Вот код, который я использую:

function TForm1.Process_SMS: string; 
var 
    cursor: JCursor; 
    uri: Jnet_Uri; 
    address, person, msgdatesent, protocol, msgread, msgstatus, msgtype, 
    msgreplypathpresent, subject, body, 
    smsid, servicecenter, locked: string; 
    msgunixtimestampms: int64; 
    id_smsid, addressidx, personidx, msgdateidx, msgdatesentidx, protocolidx, 
    msgreadidx, msgstatusidx, msgtypeidx, msgreplypathpresentidx, subjectidx, 
    bodyidx, servicecenteridx, lockedidx: integer; 
begin 
    uri := StrToJURI('content://sms/inbox'); 
    cursor := SharedActivity.getContentResolver.query(uri, nil, nil, nil, nil); 
    id_smsid := cursor.getColumnIndex(StringToJstring('_id')); 
    addressidx := cursor.getColumnIndex(StringToJstring('address')); 
    personidx := cursor.getColumnIndex(StringToJstring('person')); 
    msgdateidx := cursor.getColumnIndex(StringToJstring('date')); 
    msgdatesentidx := cursor.getColumnIndex(StringToJstring('date_sent')); 
    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')); 

    while (cursor.moveToNext) do 
    begin 
    smsid := JStringToString(cursor.getString(id_smsid)); 
    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)); 
    Listbox1.Items.Add(subject); 
    // I plan on deleting messages here 
    //SharedActivity.getContentResolver.delete(uri, StringToJString('_ID=' + smsid), nil); 
    Result := IntToStr(trunc(msgunixtimestampms/1000)) + ' ' + address + ' ' + body; 
    end; 
end; 

Это, как я это называю:

procedure TForm1.SpeedButton1Click(Sender: TObject); 
begin 
    label1.text := Process_SMS; 
end; 

Вот файл XML Я использую:

<?xml version="1.0" encoding="utf-8"?> 
<!-- BEGIN_INCLUDE(manifest) --> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.embarcadero.ezt" 
    android:versionCode="19" 
    android:versionName="1.0.0" 
    android:installLocation="preferExternal"> 

<!-- This is the platform API where NativeActivity was introduced. --> 
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="11" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.BROADCAST_SMS" /> 
<uses-permission android:name="android.permission.BROADCAST_WAP_PUSH" /> 
<uses-permission android:name="android.permission.CALL_PHONE" /> 
<uses-permission android:name="android.permission.CALL_PRIVILEGED" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.READ_CALENDAR" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.READ_SMS" /> 
<uses-permission android:name="android.permission.RECEIVE_MMS" /> 
<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" /> 
<uses-permission android:name="android.permission.SEND_SMS" /> 
<uses-permission android:name="android.permission.WRITE_CALENDAR" /> 
<uses-permission android:name="android.permission.WRITE_CALL_LOG" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_SMS" /> 

<uses-feature android:glEsVersion="0x00020000" android:required="True"/> 
<application android:persistent="False" 
    android:restoreAnyVersion="False" 
    android:label="ezt" 
    android:debuggable="True" 
    android:largeHeap="False" 
    android:icon="@drawable/ic_launcher" 
    android:theme="@style/AppTheme" 
    android:hardwareAccelerated="true"> 


    <!-- Our activity is a subclass of the built-in NativeActivity framework class. 
     This will take care of integrating with our NDK code. --> 
    <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" 
      android:label="ezt" 
      android:configChanges="orientation|keyboard|keyboardHidden" 
      android:launchMode="singleTask"> 
     <!-- Tell NativeActivity the name of our .so --> 
     <meta-data android:name="android.app.lib_name" 
      android:value="ezt" /> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" /> 



    <!-- BroadcastReceiver that listens for incoming SMS messages --> 
    <receiver android:name=".SmsReceiver" 
      android:permission="android.permission.BROADCAST_SMS"> 
     <intent-filter> 
      <action android:name="android.provider.Telephony.SMS_DELIVER" /> 
     </intent-filter> 
    </receiver> 

    <!-- BroadcastReceiver that listens for incoming MMS messages --> 
    <receiver android:name=".MmsReceiver" 
     android:permission="android.permission.BROADCAST_WAP_PUSH"> 
     <intent-filter> 
      <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" /> 
      <data android:mimeType="application/vnd.wap.mms-message" /> 
     </intent-filter> 
    </receiver> 

    <!-- Activity that allows the user to send new SMS/MMS messages --> 
    <activity android:name=".ComposeSmsActivity" > 
     <intent-filter> 
      <action android:name="android.intent.action.SEND" />     
      <action android:name="android.intent.action.SENDTO" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <data android:scheme="sms" /> 
      <data android:scheme="smsto" /> 
      <data android:scheme="mms" /> 
      <data android:scheme="mmsto" /> 
     </intent-filter> 
    </activity> 

    <!-- Service that delivers messages from the phone "quick response" --> 
    <service android:name=".HeadlessSmsSendService" 
      android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE" 
      android:exported="true" > 
     <intent-filter> 
      <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:scheme="sms" /> 
      <data android:scheme="smsto" /> 
      <data android:scheme="mms" /> 
      <data android:scheme="mmsto" /> 
     </intent-filter> 
    </service> 

    </application> 
</manifest> 
<!-- END_INCLUDE(manifest) --> 

На мое тестовое устройство. Я выбрал свое приложение в качестве стандартного приложения sms и в соответствии с полномочиями «personal-> security-> app», я установил его «всегда разрешать» мой приложение для чтения SMS. Интерфейс для моего приложения - это просто Listbox и две кнопки скорости.

Прошу вас, спасибо, за вашу помощь. Я потерялся ...

ответ

1

Я отправил два текстовых сообщения с другого телефона сегодня на свое тестовое устройство, и раньше у меня было два предыдущих текстовых сообщения. Это означает, что там всего 4 сообщения (тестовое устройство). Когда я запускаю свое приложение сейчас, я вижу последние 2 текстовых сообщения. Я не знаю, почему, я вижу только последние 2. Я просто рад, что вижу что-то, потому что теперь развитие может продолжаться. У меня теперь отключены «разрешения приложений». Я также НЕ устанавливал свое приложение как sms по умолчанию. Странно, что он работает даже с этой конфигурацией. В любом случае, спасибо всем, кто зарегистрировался, чтобы рассмотреть этот вопрос.