Страница 1 из 1

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

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

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

Буду благодарен за любую информацию, ссылки по теме, куски кода, готовые решения.

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

Добавлено: 16 мар 2013, 14:18
Xakep
Сам задал вопросы. Похоже что самому и отвечать придется...
Вот тут нашел ответ на первый вопрос и вполне изящный http://stackoverflow.com/questions/7621 ... -sms-count
А вот второй вопрос, пока в силе.

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

Добавлено: 16 мар 2013, 15:18
rezak90
по второму вопросу:

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

Process process = Runtime.getRuntime().exec("ls -la");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

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

Добавлено: 16 мар 2013, 20:23
Xakep
Спасибо огромное.
Сегодня с сервисами разобрался, с автозапуском, и прерываниями от AlarmManager. Завтра с СМС и Звонками попробую разобраться. А там уже и до shell команд дойдем. :)

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

Добавлено: 17 мар 2013, 18:10
Xakep
Мне эта тема начинает напоминать "театр одного лица". :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"/>

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

Добавлено: 19 мар 2013, 23:09
Xakep
Еще раз всем доброго времени суток.
Я написал программку и она работает как нужно.
Но - но есть всегда. Столкнулся с проблемой что программа потребляет непомерно много ресурсов, и соответственно влияет на разрядку аккумулятора.
В общем нужен совет специалиста. Как поубавить аппетит программы до ресурсов?
За основу была взята вот эта программа. 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 КБ) 6785 просмотров
А в чем причина не могу понять... Может кто объяснить?

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

Добавлено: 19 мар 2013, 23:44
rezak90
он же у вас крутится всё время и конечно будет жрать батарею, я делал приложения что то в виде таймера, ну ничего не поделаешь если всё время приложение работает, увеличивайте время и будет меньше кушать

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

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

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