Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Android Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Прием звонка  [new]
JavaStudent
Member

Откуда:
Сообщений: 75
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TelephonyManager.[color=red]listen[/color](stateListener, PhoneStateListener.LISTEN_CALL_STATE);
    }
}[color=red]~[/color]

    PhoneStateListener stateListener = new PhoneStateListener() {
        public void onCallStateChanged(int state, String incomingNumber) {
            switch (state) {
                case TelephonyManager.CALL_STATE_IDLE: break;
                case TelephonyManager.CALL_STATE_OFFHOOK: break;
                case TelephonyManager.CALL_STATE_RINGING:
                    Toast.makeText(getApplicationContext(), incomingNumber, Toast.LENGTH_LONG).show();
                    try {
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
            }
        }
    };[color=red]~[/color]

Пишет Non-static method listen cannot be referenced from a static context
Куда static писать?
17 ноя 17, 00:08    [20961987]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
JavaStudent
Member

Откуда:
Сообщений: 75
Со скобками разобрался. Остался listen
17 ноя 17, 01:23    [20962041]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23783
Например так: https://stackoverflow.com/questions/13395633/add-phonestatelistener
17 ноя 17, 09:01    [20962271]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
JavaStudent
Member

Откуда:
Сообщений: 75
wadman, Я как понял замахнулся на слона. Решил разбирать слона на части.

1.) Сервис, который живет после выхода из приложения получился.
2.) Сервис, который живет после перезагрузки смартфона пока нет.

public class BootBroadcast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {       
        context.startService(new Intent(context, MyService.class));
    }
}


Не пойму, как запустить BootBroadcast (прописал в минифесте, как BOOT_COMPLETED), который запустит Сервис

3.)В сервисе реализовать слушателя состояния смартфона и выковыривать входящий номер

Или я создал Широковещательный приемник BootBroadcast, который запустит Сервис после перезагрузки?
17 ноя 17, 13:47    [20963430]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23783
JavaStudent
прописал в минифесте, как BOOT_COMPLETED

Как-то сложно гадать по кофейной гуще...
17 ноя 17, 14:12    [20963543]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
JavaStudent
Member

Откуда:
Сообщений: 75
        
          <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <receiver android:name=".BootBroadcast">
                <intent-filter >
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>
                </intent-filter>
            </receiver>
        </activity>
        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="false" >
        </service>

Я столкнулся с другой задачей. При перезагрузке смартфона, надо как-то еще к MyService подключится... И еще в уведомление сообщения закидывать, мол сервис работает.
17 ноя 17, 14:51    [20963687]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23783
Тут почитай про сервисы https://www.google.com/search?q=startandroid startservice
17 ноя 17, 15:47    [20963942]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
JavaStudent
Member

Откуда:
Сообщений: 75
wadman, читаю там и тут, везде где попадается.

Я правильно понял, что мне нужно сделать:

1) Сервис, который крутится в смартфоне и ждет сигнала на отработку

2) Широковещательный приемник в сервисе, который ждет звонок и запускает отработку

3) Отсылка POST запроса из сервиса, когда Широковещательный приемник обнаружил звонок

4) Определение номера звонка

5) Широковещательный приемник в сервисе, который запускает сервис после перезагрузки смартфона

6) Приложение, которое запускает, и останавливает сервис.

Попробую по кускам сделать. Пока сервис мой вылетает, когда из него шлю POST запрос.
17 ноя 17, 16:37    [20964255]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23783
Задача не понятна пока что.

Но в принципе описано верно: приемник бутлоад стартует слушателя звонков. Само приложение тоже может запускать слушателя. Слушатель уже может запускать нужные ему сервисы по событиям запускать.
17 ноя 17, 17:32    [20964460]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
Andrej_f
Member

Откуда: г. Курган
Сообщений: 740
JavaStudent
Пишет Non-static method listen cannot be referenced from a static context
Куда static писать?
1. Создать объект TelephonyManager tm;
2. Юзать его методы.
3. Прием входящих звонков сторонними приложениями заблокирован, начиная с Android 6 "в целях безопасности". До 6 версии можно.
17 ноя 17, 20:26    [20964910]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
JavaStudent
Member

Откуда:
Сообщений: 75
wadman, Задачка простая. Я написал программу в которой нужно регистрировать заявки, в том числе и вводить телефонные номера.

Набирать клиентам, сотрудникам, писать смс и.т.д. Еще их 3 номера телефона. Смотреть на этого сотрудника страшно.

2 гарнитуры в 2 ушах.... Хочу попробовать сделать так, чтобы сотрудник не брал смартфон в руки...... И номер не списывал со

смартфона. До набора номера мне еще далеко, а вот передать номер входящего звонка в базу и обработать его, я как понимаю смогу.

С сервисом разобрался. Пытаюсь подсунуть вместо простого сервиса вот этот.

Это сервис

public class ServiceReceiver extends BroadcastReceiver {
    TelephonyManager telephony;
    public void onReceive(Context context, Intent intent) {
        MyPhoneStateListener phoneListener = new MyPhoneStateListener();
        telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
    }
    public void onDestroy() {
        telephony.listen(null, PhoneStateListener.LISTEN_NONE);
    }

} 


Это класс

import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
public class MyPhoneStateListener extends PhoneStateListener {
    final String LOG = "myLog";
    public void onCallStateChanged(int state, String incomingNumber) {
        switch (state) {
            case TelephonyManager.CALL_STATE_IDLE:
                Log.d(LOG, "IDLE");
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                Log.d(LOG, "OFFHOOK");
                break;
            case TelephonyManager.CALL_STATE_RINGING:
                Log.d(LOG, "RINGING"+ incomingNumber);
                break;
        }
    }

}


MainActivity откуда запускаю сервис 2 кнопки...

public class MainActivity extends AppCompatActivity {
    final String LOG = "myLog";

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    }
    public void onClickStart(View v) {
        Log.d(LOG, "onClickStart");
        startService(new Intent(this, ServiceReceiver.class));
    }
    public void onClickStop(View v) {
        Log.d(LOG, "onClickStop");
        stopService(new Intent(this, ServiceReceiver.class));
    }
    public class BootBroadcast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        context.startService(new Intent(context, ServiceReceiver.class));
    }
    }

}

Пока ничего не понимаю. Разбираюсь.
17 ноя 17, 22:23    [20965084]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
JavaStudent
Member

Откуда:
Сообщений: 75
Нашел косяк. Пытаюсь вместо сервиса подсунуть широковещателя. Надо запустить из сервиса широковещателя.... и слушать его.
Ошибку обнаружил в манифесте, когда пытался широковещателя назвать сервисом.
17 ноя 17, 22:44    [20965121]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
JavaStudent
Member

Откуда:
Сообщений: 75
Пытаюсь объявить в сервисе слушателя

public int onStartCommand(Intent intent, int flags, int startId)
 {
       IntentFilter filter = new IntentFilter();
       filter.addAction(TelephonyManager.CALL_STATE_RINGING);
       registerReceiver(ServiceReceiver, filter); 
       return super.onStartCommand(intent, flags, startId);
}


Ошибки лезут.
17 ноя 17, 22:59    [20965152]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
JavaStudent
Member

Откуда:
Сообщений: 75
Ошибок нет. Но слушателя не знаю, как проверить.
Чего слушает? Где слушает?

public class MyService extends Service {
    final private String LOG = "myLog";
    private static TelephonyManager telephony;
    public void onCreate() {
        super.onCreate();
        final BroadcastReceiver ServiceReceiver = new BroadcastReceiver()
        {
            public void onReceive(Context context, Intent intent) 
           {
                MyPhoneStateListener phoneListener = new MyPhoneStateListener();
                telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
                telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
            }
            public void onDestroy() {
                telephony.listen(null, PhoneStateListener.LISTEN_NONE);
            }
        };
        IntentFilter filter = new IntentFilter();
        filter.addAction(READ_PHONE_STATE);
        registerReceiver(ServiceReceiver, filter);
    }


Подскажите, куда копать? Мои строчки:
        
        IntentFilter filter = new IntentFilter();
        filter.addAction(READ_PHONE_STATE);
        registerReceiver(ServiceReceiver, filter);


Может тут чего не так?
18 ноя 17, 12:51    [20965616]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
JavaStudent
Member

Откуда:
Сообщений: 75
Там оказалось все просто. Слушатель регистрируется либо в манифесте, либо в приложении. Дальше он живет своей жизнью. Если его не прибьет система... Если в манифесте, то я не понял, как его отключать. Номер телефона ловит на ура и отсылает POST запросом.
Набор номера и отсылка sms, думал не справлюсь с permission или вообще нельзя, но оказалось 2 строчками в коде и 2 строчками в манифесте...

Это класс слушателя
   public class PhoneReceiver extends BroadcastReceiver {
    private TelephonyManager mTelephonyManager;
    public static boolean isListening = false;
    public static String LOG = "myLog";
    private String str;
    @Override
    public void onReceive(final Context context, Intent intent) {

        mTelephonyManager = (TelephonyManager) context.getSystemService(context.TELEPHONY_SERVICE);
        PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                super.onCallStateChanged(state, incomingNumber);
                Log.d(LOG, "state="+state);
                switch (state) {
                    case TelephonyManager.CALL_STATE_RINGING:
                        switch (state) {
                            case TelephonyManager.CALL_STATE_IDLE: break;
                            case TelephonyManager.CALL_STATE_OFFHOOK: break;
                            case TelephonyManager.CALL_STATE_RINGING:
                                if (isListening) {
                                    Log.d(LOG, "RINGING=" + incomingNumber);
                                }
                             break;
                        }
                  }
            }
        };
       if(!isListening) {
            mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
            isListening = true;
            Log.d(LOG, "listening");
       }
    }


Регистрация слушателя из Activity

 
this.registerReceiver(PhoneReceiver, new IntentFilter("android.intent.action.PHONE_STATE")); 


Манифест:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.LISTEN_CALL_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<application
....


Всем спасибо ! Без вас не справился бы.
20 ноя 17, 19:59    [20970214]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
JavaStudent
Member

Откуда:
Сообщений: 75
Система вышибает такого слушателя, если приложение закрыто. Какое-то время живет слушатель, потом выносит.
Я как понял, из-за того, что слушателя регистрирую из Activity. Кто знает как сервис сделать слушателем?
Попробую зарегистрировать слушателя при создании сервиса. Если регистрировать его через манифест, то как его отключать?
21 ноя 17, 15:30    [20972586]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
Oleg Shishkin
Member

Откуда: Нижний Новгород
Сообщений: 104
Объявляй в манифесте свой BrodcastReciever - в него будешь принимать сообщения. Из него в течение 4 сек ты должен вывалиться. А то приложение упадет. Соответственно в BrodcastReciever ты должен или стартовать сервис через intent или передавать сообщение через EventBus в singleton
21 ноя 17, 16:28    [20972765]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
Oleg Shishkin
Member

Откуда: Нижний Новгород
Сообщений: 104
http://startandroid.ru/ru/uroki/vse-uroki-spiskom/165-urok-100-service-intentservice-foreground-avtozagruzka-servisa.html
https://guides.codepath.com/android/Starting-Background-Services
21 ноя 17, 16:43    [20972822]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
JavaStudent
Member

Откуда:
Сообщений: 75
Oleg Shishkin, Я запутался. BroadcastReceiver запустил из сервиса. BroadcastReceiver должен кинуть номер телефона. Сервис должен принять номер и отработать в потоке запрос к MySQL. Еще надо запустить таймер в потоке, который будет запускать запрос к MySQL
отсылать sms. Все работает по отдельности. BroadcastReceiver, Timer, Service, POST запрос к mySQL, отсылка sms.

Надо научиться кидаться номером телефона в сервис...

Есть надежда, что может система не убьет BroadcastReceiver, если жив Servise, который его запустил. И понять кто кого запускает.

ковыряю [url=]https://habrahabr.ru/post/265159/[/url]
22 ноя 17, 01:21    [20973902]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
JavaStudent
Member

Откуда:
Сообщений: 75
public class PhoneReceiver extends BroadcastReceiver {
    private TelephonyManager mTelephonyManager;
    public static boolean isListening = false;
    public static String LOG = "myLog";
    private String js;
    @Override
    public void onReceive(final Context context, Intent intent) {

        mTelephonyManager = (TelephonyManager) context.getSystemService(context.TELEPHONY_SERVICE);
        PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                super.onCallStateChanged(state, incomingNumber);
                Log.d(LOG, "state="+state);
                switch (state) {
                    case TelephonyManager.CALL_STATE_RINGING:
                        switch (state) {
                            case TelephonyManager.CALL_STATE_IDLE: break;
                            case TelephonyManager.CALL_STATE_OFFHOOK: break;
                            case TelephonyManager.CALL_STATE_RINGING:
                                if (isListening) {
                                 js=incomingNumber.replace("+","")

// Не могу понять, чего писать вместо (?????)
                                    Intent intfil =new Intent(?????,MyService.class).putExtra(js,1);
// Эта строка красная
                                    startService(intfil);

                                }
                             break;
                        }
                  }
            }
        };
       if(!isListening) {
            mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
            isListening = true;
            Log.d(LOG, "listening");
       }
    }


День утра мудрее. Пойду спать. 2 дня битвы позади.
22 ноя 17, 02:14    [20973939]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23783
JavaStudent
// Не могу понять, чего писать вместо (?????)

context вполне сгодится.
22 ноя 17, 09:34    [20974170]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
JavaStudent
Member

Откуда:
Сообщений: 75
context вводил, он подчеркивается.
Попробую
context.startService(new Intent(context, MyService.class).putExtra(str, 1));

Я до конца не понял кто кого поднимает.

Читал что BroadcastReceiver долго не живет, нужен Service. А Service получил, сработал, отвалил. Я сейчас добился, что
BroadcastReceiver переживает перезагрузку, выход из приложения, 1 сутки не вылетает. Сейчас надо научиться в сервис подсовывать
задачки на выполнение, и выполнять задачи по таймеру слушать MySQL. Пока отсылку номера делает BroadcastReceiver, хочу переложить эту задачку на Service. И разобраться откуда и кого запускать.

Сейчас: Activity запускает Service, Service запускает BroadcastReceiver слушателей CALL,SMS,BOOT
BroadcastReceiver шлет Intent Service, Service принимает и отрабатывает.

Если BroadcastReceiver умрет, то Service не сработает. Если Service умрет, то BroadcastReceiver(ы) ни к чему... Приемник убит.
Хочется их связать, чтобы умирали, то вместе и с предсмертной запиской. Убили, работать не будет.

Задача управлять 3 задачками не беря смарфон в руки. Набирать номер, рассылка cmc , пересылать входящий номер для ввода в базу данных.
22 ноя 17, 12:35    [20974711]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23783
JavaStudent
Читал что BroadcastReceiver долго не живет

Он запускается только при необходимости (при получении события) и ему дается несколько секунд жизни на всёпровсё.

Чтобы понять, как оно работает и живет, можно создать пустой приемник, который просто кидает в лог события старта и запустить в отладке на телефоне. Потом добавить запуск сервиса, который пишет в базу и тоже с логом.

Помимо встроенного слушателя логов в студии есть внешний android monitor.
22 ноя 17, 12:54    [20974795]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
JavaStudent
Member

Откуда:
Сообщений: 75
Согласен. Что сначала надо набросать болванку. Отработать вкл и выкл всего и всех. Я плохо понял Intent ы. Пойду изучать мат.часть...
Наскоком получилось. Но почему работает не пойму. И пока в service задачку из слушателя не получилось закинуть.

p.s.
Если точно знаешь, кто виноват - не выдавай себя.))
22 ноя 17, 19:19    [20976120]     Ответить | Цитировать Сообщить модератору
 Re: Прием звонка  [new]
JavaStudent
Member

Откуда:
Сообщений: 75
Я сделал еще одного слушателя Alarm extends BroadcastReceiver. Он проверяет каждые n минут и если сервис убили, запускает его.

if (!isRunning(context)) {
context.startService(new Intent(context, MyService.class));
}

После проверки isRunning(context) запустим задачку... сегодня попробую.

Есть разница где находится слушатель в отдельном файле или вложен в service?
(intent к Service пишется по другому, в манифесте receiver регистрируется по другому, а еще подводные камни?)

Alarm extends BroadcastReceiver я сделал внутри Service, есть смысл перенести слушателя LISTEN_CALL_STATE туда же.
Или без разницы?
23 ноя 17, 13:57    [20977826]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Android Ответить