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

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

Войти
Регистрация
Восстановить пароль
 
 
Sharwwe
0 / 0 / 0
Регистрация: 10.07.2016
Сообщений: 18
#1

Вывод смс в textView - Android

10.07.2016, 09:29. Просмотров 857. Ответов 36

Добрый день Уже пару дней не могу разобраться с кодом. Половина кода, была свиснута с этого видео https://www.youtube.com/watch?v=op_7cUKceaA&t=1006s Мне нужно было только получение смс, и вывод в textView, перехватить удалось, а вот вывести в textView не получается. Прошу помощи, очень надеюсь что не пройдете мимо

MainActivity.java
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MainActivity extends Activity {
    
    IntentFilter intentFilter;
    
    private BroadcastReceiver intentReceiver = new BroadcastReceiver(){
        @Override
        public void onReceive(Context context,Intent intent)
        {
            TextView inTxt = (TextView) findViewById(R.id.textView1);
            inTxt.setText(intent.getExtras().getString("sms"));
            
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction("SMS_RECEIVED_ACTION");
        }   
    };
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
    
}
}


SmsRecever.java
Кликните здесь для просмотра всего текста
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
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.TextView;
import android.widget.Toast;
 
public class SmsRecever extends BroadcastReceiver {
 
    @SuppressWarnings("deprecation")
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        SmsMessage[] messages = null;
        String str = "";
        if(bundle != null)
        {
            Object[] pdus = (Object[]) bundle.get("pdus");
            messages = new SmsMessage[pdus.length];
            for(int i=0; i<messages.length; i++)
            {
                messages[i]=SmsMessage.createFromPdu((byte[])pdus[i]);
                str += "Message from "+messages[i].getOriginatingAddress();
                str += " :";
                str += messages[i].getMessageBody().toString();
                str += "\n";
            }
            Toast.makeText(context, str, Toast.LENGTH_LONG).show();
        
 
            Intent broadcastIntent = new Intent();
            broadcastIntent.setAction("SMS_RECEIVED_ACTION");
            broadcastIntent.putExtra("sms", str);
            context.sendBroadcast(broadcastIntent);
            abortBroadcast();
 
    }
    }
    }


Manifest

Кликните здесь для просмотра всего текста
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
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="example.smsrecever"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="10" />
    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
    <uses-permission android:name="android.permission.READ_SMS"/>
    
 
    <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>
        <activity
            android:name=".AdctivityMainActivity"
            android:label="@string/title_activity_adctivity_main" >
        </activity>
        <receiver android:name="SmsRecever">
            <intent-filter android:priority="100">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>
    </application>
 
</manifest>
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OlegJV
102 / 102 / 29
Регистрация: 13.03.2016
Сообщений: 471
10.07.2016, 10:30     Вывод смс в textView #2
Зачем такие сложности? Сделай простой интент. Если подождать часа 3-4, пока я до компа доберусь... А так у тебя ресивер в активити не регистрируется и фильтр как-то странно расположен...
Sharwwe
0 / 0 / 0
Регистрация: 10.07.2016
Сообщений: 18
11.07.2016, 10:20  [ТС]     Вывод смс в textView #3
Спасибо за совет, на самом деле я сам сейчас не за пк, так что я могу подождать до вечера

Добавлено через 23 часа 37 минут
OlegJV, Простите за наглость, но не могли бы вы написать мне под редактированный код?
OlegJV
102 / 102 / 29
Регистрация: 13.03.2016
Сообщений: 471
11.07.2016, 13:16     Вывод смс в textView #4
Ну я так понял, что текст СМС благополучно перехвачен в ресивере. Далее все зависит от того, запущена активити или нет. Если запущена, то в ресивере формируем интент:

Кликните здесь для просмотра всего текста
Java
1
2
3
4
Intent intent = new Intent(INTENT_NAME);    // В INTENT_NAME желательно использовать имя пакета
                                            // чтоб обеспечить уникальность
intent.putExtra("data", smsText);       // Втыкаем в интент текст смски
context.sendBroadcast(intent);  // и отсылаем его по системе...


А теперь ловим его в активити, например делаем там метод receive(), который запускаем, например, в onCreate:

Кликните здесь для просмотра всего текста
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
private void receive(boolean b) {
        if (b) { // в onCreate пишем receive(true), чтоб зарегистрировать ресивер.
            IntentFilter filter = new IntentFilter();
            filter.addAction(INTENT_NAME);
 
            br = new BroadcastReceiver() {
 
                @Override
                public void onReceive(Context context, Intent intent) {
                    if (intent.getAction().equals(INTENT_NAME)) {
                        String smsText = intent.getStringExtra("data");
                        // делаем что нам надо с полученным текстом
                    }
                }
            };
            try {
                registerReceiver(br, filter);
            }
            catch (Exception e) {
            }
        }
        else { //
            try {
                unregisterReceiver(br); //в onPause пишем receive(false), чтоб убить ресивер.
            }
            catch (Exception e) {
            }
        }
    }


Обработчики ошибок на усмотрение...

Добавлено через 17 минут
Если же активити не запущена, еще проще - запускаем ее:

Java
1
2
3
    Intent intent = new Intent(context, MyActivity.class);
    intent.putExtra("data", smsText);
    context.startActivity(intent);
А в onCreate активити ловим:

Java
1
String smsText = getIntent.getStringExtra("data");
Sharwwe
0 / 0 / 0
Регистрация: 10.07.2016
Сообщений: 18
11.07.2016, 15:41  [ТС]     Вывод смс в textView #5
OlegJV, Спасибо большое, попозже проверю) Я вот раньше такой код находил на форуме, но в textView не выводило, и сообщения бесконечно появлялись) Хотя у меня на первый взгляд, никаких сомнений не появилось что это не заработает)
Кликните здесь для просмотра всего текста
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
public class MainActivity extends Activity {
    
    IntentFilter IntentFilter = new IntentFilter();
    
    private BroadcastReceiver intentReceiver = new BroadcastReceiver(){
        @Override
        public void onReceive(Context context,Intent intent)
        {
            receve(true);
            TextView wTxt = (TextView) findViewById(R.id.textv);
            wTxt.setText(intent.getExtras().getString("message"));
            String sinTxt = intent.getStringExtra("message");   
        
            
            }
        
 
        private void receve(boolean b) {
            // TODO Auto-generated method stub
            
        }   
    };
 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
    
}
 
   }
OlegJV
102 / 102 / 29
Регистрация: 13.03.2016
Сообщений: 471
11.07.2016, 15:47     Вывод смс в textView #6
Очень загадочный код
Sharwwe
0 / 0 / 0
Регистрация: 10.07.2016
Сообщений: 18
19.07.2016, 19:52  [ТС]     Вывод смс в textView #7
OlegJV, Странно, но преложение вообще перестало перехватывать смс... Вы не могли бы написать полный код? Я был бы очень признателен)
OlegJV
102 / 102 / 29
Регистрация: 13.03.2016
Сообщений: 471
19.07.2016, 20:17     Вывод смс в textView #8
На каком этапе теряется смс?

Добавлено через 4 минуты
Выложи код
Sharwwe
0 / 0 / 0
Регистрация: 10.07.2016
Сообщений: 18
19.07.2016, 20:19  [ТС]     Вывод смс в textView #9
OlegJV, Я сам не знаю.. Отладка почему то не работает(Раньше все было норм). Я сделал что бы открывалось новое активити, но смс не перехватывается, и даже активити не открывается....

Добавлено через 1 минуту
OlegJV,
Кликните здесь для просмотра всего текста
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
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.TextView;
import android.widget.Toast;
 
public class Recever extends BroadcastReceiver {
 
    @SuppressWarnings("deprecation")
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        SmsMessage[] messages = null;
        String str = "";
        if(bundle != null)
        {
            Object[] pdus = (Object[]) bundle.get("pdus");
            messages = new SmsMessage[pdus.length];
            for(int i=0; i<messages.length; i++)
            {
                messages[i]=SmsMessage.createFromPdu((byte[])pdus[i]);
                str += "Message from "+messages[i].getOriginatingAddress();
                str += " :";
                str += messages[i].getMessageBody().toString();
                str += "\n";
            }
            Toast.makeText(context, str, Toast.LENGTH_LONG).show();
        
 
            Intent intent1 = new Intent(context, MyActivity.class);
            intent1.putExtra("data", str);
            context.startActivity(intent1);
            
            Intent broadcastIntent = new Intent();
            abortBroadcast();
 
    }
    }
    }


MyActivity

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MyActivity extends Activity {
 
    
 
    
 
    private Intent intent;
 
    protected void onCreate(Bundle savedInstanceState, Intent getIntent) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        String str = getIntent.getStringExtra("data");
 
        
        TextView str1 = (TextView) findViewById(R.id.textView1);
        str1.setText(intent.getExtras().getString("data"));
        
 
 
 
    }
}
OlegJV
102 / 102 / 29
Регистрация: 13.03.2016
Сообщений: 471
19.07.2016, 20:31     Вывод смс в textView #10
Попробуй в ресивере перед startActivity вставить:

Java
1
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Добавлено через 23 секунды
У меня сейчас нет компа под рукой

Добавлено через 1 минуту
И логами пользоваться учись
Sharwwe
0 / 0 / 0
Регистрация: 10.07.2016
Сообщений: 18
19.07.2016, 20:36  [ТС]     Вывод смс в textView #11
OlegJV, Поставил, что то должно было измениться?
OlegJV
102 / 102 / 29
Регистрация: 13.03.2016
Сообщений: 471
19.07.2016, 20:42     Вывод смс в textView #12
Ну как минимум активити должна открываться

Добавлено через 47 секунд
Напиши по человечески, какие ошибки получаешь

Добавлено через 49 секунд
В манифесте активити зарегистрирована?

Добавлено через 1 минуту
broadcastIntent это для чего вообще у тебя?

Добавлено через 2 минуты
Toast в ресивере выводится? Вообще-то для этого есть Log.d("TAG", Str);
Sharwwe
0 / 0 / 0
Регистрация: 10.07.2016
Сообщений: 18
19.07.2016, 20:43  [ТС]     Вывод смс в textView #13
OlegJV, Активити не открывается. Ошибок нет, просто сообщение не перехватывается.. Да зарегистрирована...
OlegJV
102 / 102 / 29
Регистрация: 13.03.2016
Сообщений: 471
19.07.2016, 20:48     Вывод смс в textView #14
Ну почему ты решил, что не перехватывается?

Добавлено через 58 секунд
Что насчёт Toast?

Добавлено через 1 минуту
Метод onReceive срабатывает?
Sharwwe
0 / 0 / 0
Регистрация: 10.07.2016
Сообщений: 18
19.07.2016, 20:58  [ТС]     Вывод смс в textView #15
OlegJV, Потому что сообщение о перехвате не выводится... По идее после перехвата должно выводиться...
OlegJV
102 / 102 / 29
Регистрация: 13.03.2016
Сообщений: 471
19.07.2016, 21:55     Вывод смс в textView #16
Ты, видимо, партизан. Каждый ответ выпытывать надо. onReceive срабатывает?

Добавлено через 4 минуты
Забегая вперёд - насчёт активити. У тебя там объявлен intent. По умолчанию он null. Какой текст ты надеешься из него получить?

Добавлено через 46 минут
А в ответ тишина. Ну ладно. Вот разрешения в манифесте:

Java
1
2
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
Вот ресивер в манифесте:

Java
1
2
3
4
5
        <receiver android:name=".SmsReceiver">
            <intent-filter android:priority="100">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>
Вот код ресивера:

Кликните здесь для просмотра всего текста
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
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.telephony.SmsMessage;
import android.util.Log;
 
public class SmsReceiver extends BroadcastReceiver {
 
    private static final String ACTION  = "android.provider.Telephony.SMS_RECEIVED";
 
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("TAG", "сработал onReceive");
 
        if (intent != null && intent.getAction() != null && ACTION.compareToIgnoreCase(intent.getAction()) == 0) {
            Object[] pduArray = (Object[]) intent.getExtras().get("pdus");
            SmsMessage[] messages = new SmsMessage[pduArray.length];
            for (int i = 0; i < pduArray.length; i++) {
 
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    String format = intent.getExtras().getString("format");
                    messages[i] = SmsMessage.createFromPdu((byte[]) pduArray[i], format);
                }
                else {
                    messages[i] = SmsMessage.createFromPdu((byte[]) pduArray[i]);
                }
            }
            String sms_from = messages[0].getDisplayOriginatingAddress();
            StringBuilder bodyText = new StringBuilder();
            for (int i = 0; i < messages.length; i++) {
                bodyText.append(messages[i].getMessageBody());
            }
            String body = bodyText.toString();
 
            Log.e("TAG", "получили СМС от " + sms_from + " : " + body);
 
            Intent activityIntent = new Intent(context, MainActivity.class);
            activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            activityIntent.putExtra("from", sms_from);
            activityIntent.putExtra("body", body);
            context.startActivity(activityIntent);
        }
    }
}


Вот код в активити:

Java
1
2
3
4
5
6
7
8
9
10
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        Intent intent = getIntent();
        String message = intent.getStringExtra("body");
        Log.e("TAG", "get sms " + message);
 
}
Все прекрасно работает. Ты на тот номер хоть СМС отправляешь?

Добавлено через 2 минуты
Специально пошел на работу до кабинета с компьютером. А у меня GMT +5.
Sharwwe
0 / 0 / 0
Регистрация: 10.07.2016
Сообщений: 18
21.07.2016, 12:51  [ТС]     Вывод смс в textView #17
OlegJV, Спасибо, друг! Я не отвечал потому что было поздно, и я начал сильно тупить, и не хотел глупыми вопросами загружать) Спасибо большое, просто огромное!

Добавлено через 23 часа 47 минут
OlegJV, Спасибо еще раз все работает) Хотел спросить, может вы мне подскажите, как запретить передавать буквы? Т.е что бы от сообщения "hello 5544" передавалось только число?
OlegJV
102 / 102 / 29
Регистрация: 13.03.2016
Сообщений: 471
21.07.2016, 15:16     Вывод смс в textView #18
Java
1
2
3
4
5
6
7
8
9
    Pattern pattern = Pattern.compile("\\d+");
        String s = "hello 5544";
        String result = "";
        Matcher matcher = pattern.matcher(s);
        int start = 0;
        while (matcher.find(start)) {
            result = s.substring(matcher.start(), matcher.end());
            start = matcher.end();
        }
Sharwwe
0 / 0 / 0
Регистрация: 10.07.2016
Сообщений: 18
21.07.2016, 17:03  [ТС]     Вывод смс в textView #19
OlegJV, Это в ресивере?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2016, 17:08     Вывод смс в textView
Еще ссылки по теме:

Android Текст из TextView перенести в другой TextView по нажатию Button
TextView txt = new TextView(this); - ошибка Android
Android Вывод в GridView в одной ячейке несколько TextView
Android Как задать определённый номер на отправку смс и приём смс
Вывод в textView из БД Android

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

Или воспользуйтесь поиском по форуму:
OlegJV
102 / 102 / 29
Регистрация: 13.03.2016
Сообщений: 471
21.07.2016, 17:08     Вывод смс в textView #20
Это где хочешь. Хочешь - в ресивере перед передачей, хочешь в активити перед выводом текста
Yandex
Объявления
21.07.2016, 17:08     Вывод смс в textView
Ответ Создать тему
Опции темы

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