Autore Topic: Conteggio SMS non letti  (Letto 1221 volte)

Offline gabriele97

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Google+
    • Mostra profilo
    • Gabriele97's Blog
  • Dispositivo Android:
    Samsung Galaxy Mini
  • Sistema operativo:
    Windows 7 Ultimate 32bit
Conteggio SMS non letti
« il: 01 Settembre 2011, 13:45:52 CEST »
0
salve,
mi sapreste dire come ricavare il numero di SMS non letti?
Grazie ...

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:Conteggio SMS non letti
« Risposta #1 il: 01 Settembre 2011, 14:25:06 CEST »
+1
Ciao,
intendi gli SMS presenti nell'inbox o tutti? Attenzione in ogni caso le API per la gestione degli sms non sono pubbliche, si può fare qualcosa ma se in futuro Google cambia le logiche devi rivedere la tua app.

Potresti provare in questo modo.

Ottenere tutte le colonne del content provider degli sms nell'inbox:

Codice (Java): [Seleziona]
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(Uri.parse("content://sms/inbox"), null, null, null, null);
// Qui puoi vedere tutte le colonne diponibili nel content provider
String[] columnNames = cursor.getColumnNames();

Nel tuo caso dovrebbe essere una cosa del genere:

Codice (Java): [Seleziona]
Uri uriSms = Uri.parse("content://sms/inbox");
Cursor c = getContentResolver().query(uriSms, new String[] { "_id" }, "read = ?", new String[] { String.valueOf(false) }, null);
int unreadSms = c.getCount();

denper.

Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline gabriele97

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Google+
    • Mostra profilo
    • Gabriele97's Blog
  • Dispositivo Android:
    Samsung Galaxy Mini
  • Sistema operativo:
    Windows 7 Ultimate 32bit
Re:Conteggio SMS non letti
« Risposta #2 il: 01 Settembre 2011, 14:50:51 CEST »
0
ok, ma come faccio ad implementarlo nel mio codice. Mi servirebbe su un widget, quindi niente activity

Codice (Java): [Seleziona]
package com.gabriele97.tweetsms;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Dialog;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.RemoteViews;
import android.widget.Toast;

public class TweetSMS extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1, 1000);

}

private class MyTime extends TimerTask {
RemoteViews remoteViews;
AppWidgetManager appWidgetManager;
ComponentName thisWidget;
DateFormat format = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM,
Locale.getDefault());
public MyTime(Context context, AppWidgetManager appWidgetManager) {
this.appWidgetManager = appWidgetManager;
remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
thisWidget = new ComponentName(context, TweetSMS.class);
}
@Override
public void run() {
//remoteViews.setTextViewText(R.id.widget_textview, "Time = " + format.format(new Date()));
remoteViews.setTextViewText(R.id.widget_textview, "acca = " + Mg.a);
appWidgetManager.updateAppWidget(thisWidget, remoteViews);
}
}

@Override
public void onReceive(Context context, Intent intent) {
// v1.5 fix that doesn't call onDelete Action
final String action = intent.getAction();
if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
final int appWidgetId = intent.getExtras().getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
this.onDeleted(context, new int[] { appWidgetId });
}
} else {
super.onReceive(context, intent);
}
}

}

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Conteggio SMS non letti
« Risposta #3 il: 01 Settembre 2011, 14:56:25 CEST »
0
Cosa ne pensi di formattare il codice prima di postarlo?

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:Conteggio SMS non letti
« Risposta #4 il: 01 Settembre 2011, 15:04:40 CEST »
0
Immagino che il problema ce l'hai nel getContentResolver().
Se hai il context, come mi sebra di vedere, basta che scrivi:

Codice (Java): [Seleziona]
context.getContentResolver()...
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline gabriele97

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Google+
    • Mostra profilo
    • Gabriele97's Blog
  • Dispositivo Android:
    Samsung Galaxy Mini
  • Sistema operativo:
    Windows 7 Ultimate 32bit
Re:Conteggio SMS non letti
« Risposta #5 il: 01 Settembre 2011, 15:30:10 CEST »
0
cosi^ sono nuovo del java :D

Codice (Java): [Seleziona]
package com.gabriele97.tweetsms;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Dialog;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.RemoteViews;
import android.widget.Toast;

public class TweetSMS extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1, 1000);

}

private class MyTime extends TimerTask {
RemoteViews remoteViews;
AppWidgetManager appWidgetManager;
ComponentName thisWidget;
DateFormat format = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM,
Locale.getDefault());
public MyTime(Context context, AppWidgetManager appWidgetManager) {
this.appWidgetManager = appWidgetManager;
remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
thisWidget = new ComponentName(context, TweetSMS.class);
///quiiiiiiii
Uri uriSms = Uri.parse("content://sms/inbox");
Cursor c = context.getContentResolver().query(uriSms, new String[] { "_id" }, "read = ?", new String[] { String.valueOf(false) }, null);
int unreadSms = c.getCount();
}
@Override
public void run() {
//remoteViews.setTextViewText(R.id.widget_textview, "Time = " + format.format(new Date()));
remoteViews.setTextViewText(R.id.widget_textview, "acca = " + Mg.a);
appWidgetManager.updateAppWidget(thisWidget, remoteViews);
}
}

@Override
public void onReceive(Context context, Intent intent) {
// v1.5 fix that doesn't call onDelete Action
final String action = intent.getAction();
if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
final int appWidgetId = intent.getExtras().getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
this.onDeleted(context, new int[] { appWidgetId });
}
} else {
super.onReceive(context, intent);
}
}

}

se si, l'app crasha all'avvio

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:Conteggio SMS non letti
« Risposta #6 il: 01 Settembre 2011, 15:49:29 CEST »
0
Se crash è buona norma aggiungere il Logcat, dove è indicato il punto dove va in errore.
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline gabriele97

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Google+
    • Mostra profilo
    • Gabriele97's Blog
  • Dispositivo Android:
    Samsung Galaxy Mini
  • Sistema operativo:
    Windows 7 Ultimate 32bit
Re:Conteggio SMS non letti
« Risposta #7 il: 01 Settembre 2011, 16:02:23 CEST »
0
leggendo da DDMS, credo che sia un problema di permessi. nel manifest quale permesso devo aggiungere?

http://gabriele97.no-ip.org/log%20%282%29.txt
« Ultima modifica: 01 Settembre 2011, 16:09:25 CEST da gabriele97 »

Offline acquariusoft

  • Utente normale
  • ***
  • Post: 157
  • Respect: +2
    • Mostra profilo
    • Visita il mio blog
  • Dispositivo Android:
    Galaxy ace, Asus eee transformer
  • Play Store ID:
    acquariusoft
  • Sistema operativo:
    Windows 7
Re:Conteggio SMS non letti
« Risposta #8 il: 01 Settembre 2011, 16:13:01 CEST »
0
beh, la riga del log mi sembra esplicativa

java.lang.SecurityException: Permission Denial: reading com.android.providers.telephony.SmsProvider uri content://sms/inbox from pid=224, uid=10035 requires android.permission.READ_SMS

sempre leggere il log bene!!

Offline gabriele97

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Google+
    • Mostra profilo
    • Gabriele97's Blog
  • Dispositivo Android:
    Samsung Galaxy Mini
  • Sistema operativo:
    Windows 7 Ultimate 32bit
Re:Conteggio SMS non letti
« Risposta #9 il: 01 Settembre 2011, 16:18:16 CEST »
0
si, aggiungendo READ_SMS come permesso non ho nessun errore. il problema è che adesso la variabile unreadSms rimane a 0!!

Codice (non è tutto, solo un pezzettino):

Codice (Java): [Seleziona]
private class MyTime extends TimerTask {
RemoteViews remoteViews;
AppWidgetManager appWidgetManager;
ComponentName thisWidget;
DateFormat format = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM,
Locale.getDefault());
public MyTime(Context context, AppWidgetManager appWidgetManager) {
this.appWidgetManager = appWidgetManager;
remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
thisWidget = new ComponentName(context, TweetSMS.class);
Uri uriSms = Uri.parse("content://sms/inbox");
Cursor c = context.getContentResolver().query(uriSms, new String[] { "_id" }, "read = ?", new String[] { String.valueOf(false) }, null);
int unreadSms = c.getCount();
Mg.a = unreadSms;
}
@Override
public void run() {
//remoteViews.setTextViewText(R.id.widget_textview, "Time = " + format.format(new Date()));
remoteViews.setTextViewText(R.id.widget_textview, format.format(new Date()) + " = " + Mg.a);
appWidgetManager.updateAppWidget(thisWidget, remoteViews);
}
}

Sul widget viene visualizzato (data) = 0
la data viene aggiornata regolarmente, però la variabile int rimane a 0. da telnet con sms send 123456789 as dw mi invio il messaggio e rimane sempre a 0. che faccio?

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:Conteggio SMS non letti
« Risposta #10 il: 01 Settembre 2011, 16:24:25 CEST »
0
In eclipse selezionando il codice e premendo ctrl-shift-f formatti il codice. Come ti è già stato detto rendi più facile la lettura a chi vuole aiutarti ;)
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline gabriele97

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Google+
    • Mostra profilo
    • Gabriele97's Blog
  • Dispositivo Android:
    Samsung Galaxy Mini
  • Sistema operativo:
    Windows 7 Ultimate 32bit
Re:Conteggio SMS non letti
« Risposta #11 il: 01 Settembre 2011, 16:30:56 CEST »
0
si giusto scusa XD la prossima volta che posto un codice lo faccio :D

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Conteggio SMS non letti
« Risposta #12 il: 01 Settembre 2011, 16:49:53 CEST »
0
Cmq i messaggi non letti hanno l'attributo read = 0, non read = false , credo sia li il problema ;)

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:Conteggio SMS non letti
« Risposta #13 il: 01 Settembre 2011, 16:50:01 CEST »
0
Sistemato:

Codice (Java): [Seleziona]
Uri uriSms = Uri.parse("content://sms/inbox");
Cursor c = getContentResolver().query(uriSms, new String[] { "_id" }, "read = ?", new String[] { String.valueOf(0) }, null);
int unreadSms = c.getCount();
Log.v(TAG, unreadSms + " not read sms");
c.close();

Due cose:
Bisogna passare nel filtro 0 e non false.
Mancava la chiusura del cursore.

CONSIDERAZIONI:
Come ti avevo accennato all'inizio il content provider degli sms non è pubblico per cui potrebbe capitare che alcune case produttrici di telefoni customizzano la gestione degli sms per cui la tua applicazione potrebbe non funzionare su quei dispositivi. In ogni caso da quanto ho potuto vedere la gestione degli sms è piuttosto standard. Ti faccio un esempio: a me è capitato di scrivere un'app per la rimozione dei log delle chiamate e degli sms, che aveva qualche problema con le versioni Android 2.2+ di samsung, in quanto la casa coreana ha implementato una gestione ad-hoc dei log in cui non vengono registrate solo le chiamate ma anche i log degli sms, di conseguenza ho dovuto fare del lavoro extra!
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:Conteggio SMS non letti
« Risposta #14 il: 01 Settembre 2011, 16:50:59 CEST »
0
Ricky, mi hai fregato sult tempo!
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial