Пропущенные СМС и Звонки.

Ответить
Аватара пользователя
Xakep
Сообщения: 9
Зарегистрирован: 15 мар 2013, 17:17

Пропущенные СМС и Звонки.

Сообщение Xakep » 16 мар 2013, 08:21

Всем доброго времени суток.
Должен предупредить сразу что в Eclipse я фактически полный ноль, хотя имею не малый опыт кодинга на других языках для других платформ. Да и в модинге готовых АРК и Android-a в целом я тоже не плохо преуспел.

Вообщем возникла необходимость написать маленькую утилитину которая будет отслеживать СМС и Звонки. И при их поступлении будет писать ключ в некий порт - для включения светодиода индикации. И естественно при отсутствии пропущенных СМС и Звонков, гасить этот светодиод.
Основную массу решений вопросов я уже нашел. В основном осталось два вопроса.
1. Как отследить наличие пропущенных СМС и Звонков, и момент когда их прочитают или просмотрят?
2. Как из тела программы выполнять SHELL команды?

Буду благодарен за любую информацию, ссылки по теме, куски кода, готовые решения.
"О, сколько нам открытий чудных готовит Microsoft’а дух, и Intel - сын ошибок трудных, и Borland - Paradox’ов друг..."

Аватара пользователя
Xakep
Сообщения: 9
Зарегистрирован: 15 мар 2013, 17:17

Re: Пропущенные СМС и Звонки.

Сообщение Xakep » 16 мар 2013, 14:18

Сам задал вопросы. Похоже что самому и отвечать придется...
Вот тут нашел ответ на первый вопрос и вполне изящный http://stackoverflow.com/questions/7621 ... -sms-count
А вот второй вопрос, пока в силе.
"О, сколько нам открытий чудных готовит Microsoft’а дух, и Intel - сын ошибок трудных, и Borland - Paradox’ов друг..."

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Пропущенные СМС и Звонки.

Сообщение rezak90 » 16 мар 2013, 15:18

по второму вопросу:

Код: Выделить всё

Process process = Runtime.getRuntime().exec("ls -la");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
R.id.team
Политика на форуме запрещена

Аватара пользователя
Xakep
Сообщения: 9
Зарегистрирован: 15 мар 2013, 17:17

Re: Пропущенные СМС и Звонки.

Сообщение Xakep » 16 мар 2013, 20:23

Спасибо огромное.
Сегодня с сервисами разобрался, с автозапуском, и прерываниями от AlarmManager. Завтра с СМС и Звонками попробую разобраться. А там уже и до shell команд дойдем. :)
"О, сколько нам открытий чудных готовит Microsoft’а дух, и Intel - сын ошибок трудных, и Borland - Paradox’ов друг..."

Аватара пользователя
Xakep
Сообщения: 9
Зарегистрирован: 15 мар 2013, 17:17

Re: Пропущенные СМС и Звонки.

Сообщение Xakep » 17 мар 2013, 18:10

Мне эта тема начинает напоминать "театр одного лица". :D

Вообщем разобрался я сегодня с СМС и звонками. Приведу кусок кода, мало ли кому еще сгодится...

Код: Выделить всё

Cursor c = context.getContentResolver().query(
CallLog.Calls.CONTENT_URI,
null,
CallLog.Calls.TYPE +  " = ? AND " + CallLog.Calls.NEW + " = ?",
new String[] { Integer.toString(CallLog.Calls.MISSED_TYPE), "1" },
CallLog.Calls.DATE + " DESC"
);
c.moveToFirst();    
Log.d("CALL", ""+c.getCount()); //Пишем в лог количество не принятых звонков.
	      
Uri sms_inbox = Uri.parse("content://sms/inbox");
Cursor d = context.getContentResolver().query(sms_inbox, null, "read = 0", null, null);
Log.d("SMS COUNT", ""+d.getCount()); //Пишем в лог количество не прочитанных  СМС.
Что бы этот код работал. В Манифест нужно добавить пермишены.

Код: Выделить всё

<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.READ_SMS"/>
"О, сколько нам открытий чудных готовит Microsoft’а дух, и Intel - сын ошибок трудных, и Borland - Paradox’ов друг..."

Аватара пользователя
Xakep
Сообщения: 9
Зарегистрирован: 15 мар 2013, 17:17

Re: Пропущенные СМС и Звонки.

Сообщение Xakep » 19 мар 2013, 23:09

Еще раз всем доброго времени суток.
Я написал программку и она работает как нужно.
Но - но есть всегда. Столкнулся с проблемой что программа потребляет непомерно много ресурсов, и соответственно влияет на разрядку аккумулятора.
В общем нужен совет специалиста. Как поубавить аппетит программы до ресурсов?
За основу была взята вот эта программа. ServiceExample и RepeatingAlarmService были немного изменены под свои нужды.
ServiceExample

Код: Выделить всё

package com.example.LED_Missed_Services;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.os.SystemClock;
import android.util.Log;

public class ServiceExample extends Service {

    public static final int INTERVAL = 10000; // 12 sec
    public static final int FIRST_RUN = 1000; // 1 sec
    public static int ret = 0;
    int REQUEST_CODE = 11223344;

    AlarmManager alarmManager;

    @Override
    public void onCreate() {
        ret = 1;
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        BroadcastReceiver br= new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){

                    Log.d("MyLog", "Screen ON");
                    startService(); // Если экран включен, запускаем сервис

                }else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){

                    Log.d("MyLog", "Screen OFF");
                    onDestroy(); // Если экран выключен, останавливаем сервис

                }
            }
        };
        registerReceiver(br, filter);
        super.onCreate();
        if (ret==1){ret=0;
            startService();
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        if (alarmManager != null) {
            Intent intent = new Intent(this, RepeatingAlarmService.class);
            alarmManager.cancel(PendingIntent.getBroadcast(this, REQUEST_CODE, intent, 0));
        }
    }

    private void startService() {

        Intent intent = new Intent(this, RepeatingAlarmService.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, REQUEST_CODE, intent, 0);

        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.setRepeating(
                AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime() + FIRST_RUN,
                INTERVAL,
                pendingIntent);
    }
}
RepeatingAlarmService

Код: Выделить всё

package com.example.LED_Missed_Services;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.CallLog;

public class RepeatingAlarmService extends BroadcastReceiver {

    public static final String ON = "1";
    public static final String OFF = "0";

    @Override
    public void onReceive(Context context, Intent intent) {
        Cursor c = context.getContentResolver().query(
                CallLog.Calls.CONTENT_URI,
                null,
                CallLog.Calls.TYPE +  " = ? AND " + CallLog.Calls.NEW + " = ?",
                new String[] { Integer.toString(CallLog.Calls.MISSED_TYPE), "1" },
                CallLog.Calls.DATE + " DESC"
        );
        c.moveToFirst();

        Uri sms_inbox = Uri.parse("content://sms/inbox");
        Cursor d = context.getContentResolver().query(sms_inbox, null, "read = 0", null, null);
        if (d.getCount() != 0 || c.getCount() != 0) {
            File fileName = null;
            fileName = new File("/sys/class/leds/greenled/", "brightness");
            try {
                FileWriter f = new FileWriter(fileName);
                f.write(ON); //Включаем светодиод
                f.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        else {
            File fileName = null;
            fileName = new File("/sys/class/leds/greenled/", "brightness");
            try {
                FileWriter f = new FileWriter(fileName);
                f.write(OFF); //Выключаем светодиод
                f.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
Я конечно понимаю что код скорее всего кривой до безобразия. Но. Я всего 4 дня как пытаюсь кодить на Яве...

При таком коде. При включенном экране, сервис RepeatingAlarmService нагружает процессор не по детски
По умолчанию.jpg
По умолчанию.jpg (53.87 КБ) 6784 просмотра
А в чем причина не могу понять... Может кто объяснить?
"О, сколько нам открытий чудных готовит Microsoft’а дух, и Intel - сын ошибок трудных, и Borland - Paradox’ов друг..."

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Пропущенные СМС и Звонки.

Сообщение rezak90 » 19 мар 2013, 23:44

он же у вас крутится всё время и конечно будет жрать батарею, я делал приложения что то в виде таймера, ну ничего не поделаешь если всё время приложение работает, увеличивайте время и будет меньше кушать
R.id.team
Политика на форуме запрещена

Аватара пользователя
Xakep
Сообщения: 9
Зарегистрирован: 15 мар 2013, 17:17

Re: Пропущенные СМС и Звонки.

Сообщение Xakep » 20 мар 2013, 00:58

rezak90 писал(а):он же у вас крутится всё время и конечно будет жрать батарею, ..., увеличивайте время
Не приемлемо увеличивать время. Время цикла и так 10 сек...
Не очень то приятно, когда прочитал СМС, а светодиод гаснет еще через полминуты...

Собрал аналог на while (true){...Sleep()} (все равно останавливаю сервис при выкл. экране). Даже с циклом в 3 сек., кушает ресурсы в разы меньше.
Но. Сервис постоянно "вываливается" из системы и закрывается, а это тоже не гуд...
"О, сколько нам открытий чудных готовит Microsoft’а дух, и Intel - сын ошибок трудных, и Borland - Paradox’ов друг..."

Ответить