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

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

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

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

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

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

34,5565 | 27,3444444444

подскажите пожалуйста кто сталкивался, как реализовать сию задачу?
2
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2015, 00:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как "слушать и читать" SMS c определенного номера? (Программирование Android):

Как "превратить" string "6.971245e-001" во float? - Программирование Android
Число конечно пример

Как прикрутить "свой браузер" к странице - "фрагмент" - Программирование Android
здравствуйте. все, уже голову сломал. не соображаю совсем. не получается прикрутить код браузера к странице fragments.выводиться должно на-...

Работа с БД, связывание таблиц "фильмы", "жанры", "режиссеры" - Программирование Android
Ребят, всем привет! накидайте какие-нить идеи по реализации ситуация такая есть таблицы - "списки_жанров", "фильмы", "режиссеры" мне...

Ошибка "Unknown method "e" of "org.apache.commons.logging.Log" - Программирование Android
Unknown method 'e' of 'org.apache.commons.logging.Log' package com.mycompany.myapp; import android.widget.*; import...

Постепенно вывести на экран слово "Java", в котором буквы состоят из "интересных" элементов - Программирование Android
Я учусь в универе и вот пытаюсь делать лабораторные по языку java, только на свой телефон с помощью android studio )) До этого все...

Выбор платформы разработки "1С Мобильная платформа" или "Android Studio" - Программирование Android
Всем, здравствуйте! Есть задача по разработке клиента для терминала сбора данных. Для использования его c WMS. После долгих раздумий было...

13
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
02.04.2015, 10:28 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Гугл сталкивался с подобной задачей

http://stackoverflow.com/questions/6...-specific-text
0
disx
22 / 22 / 0
Регистрация: 26.02.2014
Сообщений: 552
Записей в блоге: 1
02.04.2015, 17:44  [ТС] #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-ки именно от указанного в приложении номера?
1
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
03.04.2015, 01:08 #4
XML
1
2
   <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
чтож ты так невоспитанно без разрешения пытаешся читать смс?

добавить в AndroidManifest.xml
0
disx
22 / 22 / 0
Регистрация: 26.02.2014
Сообщений: 552
Записей в блоге: 1
03.04.2015, 08:28  [ТС] #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();
            }
        }
    }
?
1
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
03.04.2015, 08:38 #6
disx, вероятно, после проверки на слово "Hi" в коде сделать вывод на экран.
0
disx
22 / 22 / 0
Регистрация: 26.02.2014
Сообщений: 552
Записей в блоге: 1
03.04.2015, 08:58  [ТС] #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
ЗАДЕЙСТВОВАТЬ?
1
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
03.04.2015, 09:31 #8
abortBroadcast(); на версии 4.4+ не работает у приложений, которые не является месседжером по-умолчанию
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
03.04.2015, 09:31 #9
disx, http://developer.alexanderklimov.ru/.../broadcast.php - вроде, тут есть полезные моменты.
По возможности, не используйте контекст getApplicationContext(), лучше использовать контекст активности: MainActivity.this или просто this.
1
disx
22 / 22 / 0
Регистрация: 26.02.2014
Сообщений: 552
Записей в блоге: 1
04.04.2015, 11:38  [ТС] #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>
что ж ему не нравицо?
1
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
04.04.2015, 11:57 #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">
1
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
04.04.2015, 13:25 #12
>> и как быть? для чего вообще этот метод?


отменяет получение сообщения
1
disx
22 / 22 / 0
Регистрация: 26.02.2014
Сообщений: 552
Записей в блоге: 1
04.04.2015, 16:49  [ТС] #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(",", ".");
1
eos-eos
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 1
04.04.2015, 17:02 #14
Дружище если не сложно выложи рабочий код полностью, интересно посмотреть что получилось, а то читать по кусочкам тяжеловато. Спасибо!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2015, 17:02
Привет! Вот еще темы с ответами:

При эмулировании вместо надписи "Hello world" отображается "android" - Программирование Android
Привет форумчане! Я только-только начинал программировать на андроиде. Поставил среду, все настроил как на google.developers . Когда...

Что означают конструкции "finally" и "throw new"? - Программирование Android
Я с Java уже давно, но с этим столкнулся в первый раз. Объясните, пожалуйста, что означают вот это &quot;finally&quot; и &quot;throw new&quot;. Вот пример...

блокирование кнопок "Home" "Back" - Программирование Android
Доброго времени. собственно вопрос сл. можно ли заблокировать или каким либо образом отключить возможность нажатия пользования кнопок...

Как заставить Eclipse "забыть" об ошибках в xml файлах? - Программирование Android
Проблема в следующем: открываю большой проект написанный не мной - все работает нормально, то есть запускается без ошибок. в процессе...


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

Или воспользуйтесь поиском по форуму:
14
Yandex
Объявления
04.04.2015, 17:02
Ответ Создать тему
Опции темы

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