Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 533
Записей в блоге: 1
#1

Как "слушать и читать" SMS c определенного номера? - Программирование Android

02.04.2015, 00:11. Просмотров 1203. Ответов 13
Метки нет (Все метки)

нужно чтоб приложение прослушивало входящие SMS с определенного(заданного) номера и получало его текст вида(напр):

34,5565 | 27,3444444444

подскажите пожалуйста кто сталкивался, как реализовать сию задачу?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2015, 00:11     Как "слушать и читать" SMS c определенного номера?
Посмотрите здесь:
Как "превратить" string "6.971245e-001" во float? Android
Как прикрутить "свой браузер" к странице - "фрагмент" Android
Что означают конструкции "finally" и "throw new"? Android
блокирование кнопок "Home" "Back" Android
Как добавить строку "." в начале в ListView со своим обработчиком Android
Android Как поместить surfaceview или glsurfaceview на "пол" экрана
Android Как заставить Eclipse "забыть" об ошибках в xml файлах?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
02.04.2015, 10:28     Как "слушать и читать" SMS c определенного номера? #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Гугл сталкивался с подобной задачей

http://stackoverflow.com/questions/6...-specific-text
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 533
Записей в блоге: 1
02.04.2015, 17:44  [ТС]     Как "слушать и читать" SMS c определенного номера? #3
fgtmenow, спасибо, чета именно это не попадалось, со ссылкой ознакомился но имеются еще вопросы, вобщем накропал такой класс:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.graphics.Color;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
 
public class MainActivity extends Activity {
    public static final String APP_PREFERENCES = "myNumber";
    public static final String APP_PREFERENCES_NAME = "Nickname"; // phone
                                                                    // number
    private static final int DIAL = 0;
    SharedPreferences mSettings;
    private TextView text;
    Button btnmap;
    private static final String TAG = null;
    long SMSlongtitude, SMSlatitude;
    EditText messageNumber, et;
    String smsText, smsText1, smsText2;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        et = (EditText) findViewById(R.id.editText1);
        mSettings = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
        messageNumber = (EditText) findViewById(R.id.et_number);
        messageNumber.setOnLongClickListener(new View.OnLongClickListener() {
 
            @Override
            public boolean onLongClick(View v) {
                // TODO Auto-generated method stub
                showDialog(DIAL);
                return false;
            }
 
        });
        //-----Перенос полученных из SMS координат и запуск GoogleMaps-----------------------
        btnmap = (Button) findViewById(R.id.btn_send);
        if (mSettings.contains(APP_PREFERENCES_NAME)) {
            messageNumber
                    .setText(mSettings.getString(APP_PREFERENCES_NAME, ""));
        }
        btnmap.setOnClickListener(new OnClickListener() {
 
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
 
            }
        });
        ReadyMap(SMSlongtitude, SMSlatitude);
        
        
//      Toast toast = Toast.makeText(
//              getApplicationContext(), /*тело SMS*/,
//              Toast.LENGTH_LONG);
//      toast.show();
    }// -------------End------onCreate---------------------------
 
    // -------------Метод сообщающий о получении данных из SMS-----
    private void ReadyMap(long SMSlongtitude, long SMSlatitude) {
        if (SMSlongtitude != 0 || SMSlatitude != 0) {
            smsText1 = String.valueOf(SMSlongtitude);
            smsText2 = String.valueOf(SMSlatitude);
            btnmap.setBackgroundColor(Color.GREEN);
        } else {
 
            btnmap.setBackgroundColor(Color.RED);
        }
    }
 
    // ------------------------Работа со входящими
    // SMS---------------------------------------
    public class MessageReceiver extends BroadcastReceiver {
 
        public void onReceive(Context context, Intent intent) {
            Bundle pudsBundle = intent.getExtras();
            Object[] pdus = (Object[]) pudsBundle.get("pdus");
            SmsMessage messages = SmsMessage.createFromPdu((byte[]) pdus[0]);
            Log.i(TAG, messages.getMessageBody());
            
            if (messages.getMessageBody().contains("Hi")) {
                abortBroadcast();
            }
        }
    }
 
    // -------------------END---------Работа со входящими
    // SMS--------------------------------------
 
    // ------------------Диалог ввода/изменения телефонного
    // номера------------------
    protected void onPrepareDialog(int id, Dialog dialog) {
        super.onPrepareDialog(id, dialog);
        // new LockOrientation(this).lock();
        // removeDialog(id);
    }
 
    protected Dialog onCreateDialog(int id) {
 
        switch (id) {
        case DIAL:
            LayoutInflater inflater = LayoutInflater.from(this);
 
            View root = inflater.inflate(R.layout.dialogset, null);
 
            // final EditText textName = (EditText)
            // root.findViewById(R.id.et_number);
            final EditText textName2 = (EditText) root
                    .findViewById(R.id.editText1);
            String str = messageNumber.getText().toString();
            textName2.setText(str);
            // textName.getText();
 
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setView(root);
            builder.setTitle(R.string.edit_record);
            builder.setPositiveButton("Сохранить",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            String name = textName2.getText().toString();
 
                            messageNumber.setText(name);
 
                            dialog.cancel();
 
                        }
 
                    });
 
            builder.setCancelable(true);
 
            return builder.create();
        default:
            return null;
 
        }
 
    }
 
    // -----------END-------Диалог ввода/изменения телефонного
    // номера------------------
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        String strNickName = messageNumber.getText().toString(); // здесь
                                                                    // содержится
                                                                    // текст,
                                                                    // введенный
                                                                    // в
                                                                    // текстовом
                                                                    // поле
        Editor editor = mSettings.edit();
        editor.putString(APP_PREFERENCES_NAME, strNickName);
        editor.commit();
    }
}
в манифесте из примера по ссылке внес это :
Java
1
2
3
4
5
6
 <intent-filter android:priority="999">
        <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
    </intent-filter>
 
<receiver android:name="com.encima.smsreceiver.MessageReceiver" android:exported="true">
</receiver>
<receiver подчеркивает желтым и пишет "Exported receiver does not require permission" это что значит?

не могу понять как пользоваться этим классом из примера, как получить текст из SMS и вывести его хотябы пока в тост?
ну а потом, как ловить SMS-ки именно от указанного в приложении номера?
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
03.04.2015, 01:08     Как "слушать и читать" SMS c определенного номера? #4
XML
1
2
   <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
чтож ты так невоспитанно без разрешения пытаешся читать смс?

добавить в AndroidManifest.xml
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 533
Записей в блоге: 1
03.04.2015, 08:28  [ТС]     Как "слушать и читать" SMS c определенного номера? #5
fgtmenow, разрешения попросил ,.... кста, receiver все равно подчеркивает...

но как тост вывести с текстом из SMS, до сих пор не понимаю как это использовать:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 // ------------------------Работа со входящими
    // SMS---------------------------------------
    public class MessageReceiver extends BroadcastReceiver {
 
        public void onReceive(Context context, Intent intent) {
            Bundle pudsBundle = intent.getExtras();
            Object[] pdus = (Object[]) pudsBundle.get("pdus");
            SmsMessage messages = SmsMessage.createFromPdu((byte[]) pdus[0]);
            Log.i(TAG, messages.getMessageBody());
            
            if (messages.getMessageBody().contains("Hi")) {
                abortBroadcast();
            }
        }
    }
?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
03.04.2015, 08:38     Как "слушать и читать" SMS c определенного номера? #6
disx, вероятно, после проверки на слово "Hi" в коде сделать вывод на экран.
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 533
Записей в блоге: 1
03.04.2015, 08:58  [ТС]     Как "слушать и читать" SMS c определенного номера? #7
CoolMind, сделал так:
Java
1
2
3
4
5
6
7
if (messages.getMessageBody().contains("Hi")) {
                abortBroadcast();
                Toast toast = Toast.makeText(
                        getApplicationContext(), messages.getMessageBody(),
                        Toast.LENGTH_LONG);
                toast.show();   
            }
но не понимаю как сам класс
Java
1
public class MessageReceiver extends BroadcastReceiver
ЗАДЕЙСТВОВАТЬ?
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
03.04.2015, 09:31     Как "слушать и читать" SMS c определенного номера? #8
abortBroadcast(); на версии 4.4+ не работает у приложений, которые не является месседжером по-умолчанию
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
03.04.2015, 09:31     Как "слушать и читать" SMS c определенного номера? #9
disx, http://developer.alexanderklimov.ru/.../broadcast.php - вроде, тут есть полезные моменты.
По возможности, не используйте контекст getApplicationContext(), лучше использовать контекст активности: MainActivity.this или просто this.
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 533
Записей в блоге: 1
04.04.2015, 11:38  [ТС]     Как "слушать и читать" SMS c определенного номера? #10
fgtmenow,
abortBroadcast(); на версии 4.4+ не работает у приложений, которые не является месседжером по-умолчанию
и как быть? для чего вообще этот метод?

Добавлено через 1 час 2 минуты
CoolMind, ссылку почитал, принцип понял..., и совет тоже учту...

Появилась некая реакция при отправке SMS на эмулятор приложение сыпется с ошибкой:
java.lang.RuntimeException: Unable to instantiate receiver com.encima.smsreceiver.MessageReceiver: java.lang.ClassNotFoundException: com.encima.smsreceiver.MessageReceiver in loader dalvik.system.PathClassLoader[/data/app/com.babygps2-2.apk]
в манифесте сейчас так:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.babygps2"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />
 
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 
        <receiver
            android:name="com.encima.smsreceiver.MessageReceiver"
            android:enabled="true"
            android:exported="true" >
            <intent-filter android:priority="999" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" >
                </action>
            </intent-filter>
        </receiver>
    </application>
 
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
 
</manifest>
что ж ему не нравицо?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
04.04.2015, 11:57     Как "слушать и читать" SMS c определенного номера? #11
disx, честно говоря, не разбираюсь. Может, это поможет? http://stackoverflow.com/questions/1...lang-classnotf

Добавлено через 8 минут
И ещё это: http://www.coderanch.com/t/615562/An...lass-exception
В обоих случаях говорится о ненайденном классе (com.encima.smsreceiver.MessageReceiver). Возможно, ошибка в написании, например, имени пакета.

Добавлено через 57 секунд
Точно, так и есть. У вас выше указано "com.babygps2".

Добавлено через 1 минуту
Поэтому лучше писать примерно так:
XML
1
<receiver android:name=".MessageReceiver">
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
04.04.2015, 13:25     Как "слушать и читать" SMS c определенного номера? #12
>> и как быть? для чего вообще этот метод?


отменяет получение сообщения
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 533
Записей в блоге: 1
04.04.2015, 16:49  [ТС]     Как "слушать и читать" SMS c определенного номера? #13
CoolMind, отправил класс MessageReceiver в отдельный файл, в манифесте сделал так
Java
1
<receiver android:name=".MessageReceiver">
все заработало, выводит в тост текст SMS-ки,... но остался еще один оказавшийся проблемой вопрос:

получаемая строка вида: BabyGPS1, 34,3453453 | 23,43543645, с помощью кода который ниже получаю из нее две строки с цифрами, но приложение крашится и ругается на строки где парсится в double(для отправки на карты гугла), может проблема в запятых который присутствуют в координатах, как ее решить можно?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if (messages.getMessageBody().contains("BabyGPS1")) {
            
            abortBroadcast();
             
             String mes = messages.getMessageBody();
             String div="|";
             int divider = mes.indexOf(div);
             
             String Lo = mes.substring(10, divider-1);
             String La = mes.substring(divider+2);
             
                        
            Longtitude=Double.parseDouble(Lo);
            Latitude=Double.parseDouble(La);
        
            String ms = String.valueOf(Longtitude+Latitude);
             Toast.makeText(context, ": " +
                     ms,
             Toast.LENGTH_LONG).show();
            
            
        }
fgtmenow, а так это в принципе не страшно...

Добавлено через 1 час 23 минуты
Все вопрос решен, добавил замену запятой на точки, и все спарсилось:

Java
1
2
Lo = Lo.replaceAll(",", ".");
             La = La.replaceAll(",", ".");
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2015, 17:02     Как "слушать и читать" SMS c определенного номера?
Еще ссылки по теме:
Визуализация нажатия на изображение. Как поставить картинку на "нажатие" Android
Android Toolbar как отслеживать кнопку "стрелка назад"
Android Как преобразовать время из long в формат "ДД.ММ.ГГГГ"?
Android Как открывать/закрывать NavigationDrawer кнопкой "Menu"
Android Кнопка "Стереть данные", как от нее защититься?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
eos-eos
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 1
04.04.2015, 17:02     Как "слушать и читать" SMS c определенного номера? #14
Дружище если не сложно выложи рабочий код полностью, интересно посмотреть что получилось, а то читать по кусочкам тяжеловато. Спасибо!
Yandex
Объявления
04.04.2015, 17:02     Как "слушать и читать" SMS c определенного номера?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru