Страница 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
Мне эта тема начинает напоминать "театр одного лица".
Вообщем разобрался я сегодня с СМС и звонками. Приведу кусок кода, мало ли кому еще сгодится...
Код: Выделить всё
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 (53.87 КБ) 6785 просмотров
А в чем причина не могу понять... Может кто объяснить?
Re: Пропущенные СМС и Звонки.
Добавлено: 19 мар 2013, 23:44
rezak90
он же у вас крутится всё время и конечно будет жрать батарею, я делал приложения что то в виде таймера, ну ничего не поделаешь если всё время приложение работает, увеличивайте время и будет меньше кушать
Re: Пропущенные СМС и Звонки.
Добавлено: 20 мар 2013, 00:58
Xakep
rezak90 писал(а):он же у вас крутится всё время и конечно будет жрать батарею, ..., увеличивайте время
Не приемлемо увеличивать время. Время цикла и так 10 сек...
Не очень то приятно, когда прочитал СМС, а светодиод гаснет еще через полминуты...
Собрал аналог на
while (true){...Sleep()} (все равно останавливаю сервис при выкл. экране). Даже с циклом в 3 сек., кушает ресурсы в разы меньше.
Но. Сервис постоянно "вываливается" из системы и закрывается, а это тоже не гуд...