@DavidFreitas ce lien ne fonctionne pas, pouvez-vous partager le dernier lien?
Khobaib
3
@Khobaib, comme d'habitude, les choses sur Internet sont éphémères. J'ai trouvé une copie sur archive.org stackoverflow.com/a/19966227/40961 , Dieu merci pour eux (j'ai fait un don récemment pour les faire fonctionner). Mais nous devrions envisager de convertir le contenu de la page de web.archive.org/web/20121022021217/http://mobdev.olin.edu/… en syntaxe de démarque dans une réponse à cette question. Probablement une heure de travail.
David d C e Freitas
Réponses:
157
Utilisez Content Resolver ( "content: // sms / mailbox" ) pour lire les SMS qui se trouvent dans la boîte de réception.
// public static final String INBOX = "content://sms/inbox";// public static final String SENT = "content://sms/sent";// public static final String DRAFT = "content://sms/draft";Cursor cursor = getContentResolver().query(Uri.parse("content://sms/inbox"),null,null,null,null);if(cursor.moveToFirst()){// must check the result to prevent exceptiondo{String msgData ="";for(int idx=0;idx<cursor.getColumnCount();idx++){
msgData +=" "+ cursor.getColumnName(idx)+":"+ cursor.getString(idx);}// use msgData}while(cursor.moveToNext());}else{// empty box, no SMS}
Je vous remercie! Vous avez mal orthographié "getColumnName", sinon cela fonctionne comme un charme. Oh, et si quelqu'un veut l'utiliser, n'oubliez pas d'ajouter l'autorisation android.permission.READ_SMS.
qwerty
1
Merci. Je l'ai modifié :)
Suryavel TR
5
Est-ce que cela utilise également l'API non documentée que @CommonsWare a spécifiée dans son commentaire à la réponse acceptée?
Krishnabhadra
1
Attention! Ne manquez pas moveToFirstcomme moi.
Alexandr Priymak
4
@ Krishnabhadra Oui. Il utilise le fournisseur de contenu "content: // sms / mailbox" non documenté.
C'est un joli morceau de code. Une seule chose, le temps est obtenu en millisecondes. Je pense qu'il vaudra mieux en faire un format lisible par l'homme commeString receiveDayTime = Functions.dateFromMilisec(Long.valueOf(c.getColumnIndexOrThrow("date")), "hh:mm a MMM dd, yyyy");
Bibaswann Bandyopadhyay
1
quel est le but de tout faire avec getter et setter, je ne comprends vraiment pas pourquoi ne pas simplement utiliser un tableau ou une classe assoc dont les éléments sont accessibles directement
michnovka
1
@TomasNavara: Vérifiez ce code pour comprendre l'utilisation de getter et setter. pastebin.com/Nh8YXtyJ
Bugs Happen
@BibaswannBandyopadhyay Si vous ne voulez rien utiliser sauf les bibliothèques Android et les bibliothèques Java. new SimpleDateFormat("hh:mm", Locale.US).format(new Date(Long.parseLong(_time)));Cela vous donnera 24 heures.
Chris - Jr
mActivityn'est pas défini. Qu'est-ce que c'est?
2017 à 6h39
61
C'est un processus trivial. Vous pouvez voir un bon exemple dans le code source SMSPopup
Cela ne fait pas partie du SDK Android. Ce code fait l'hypothèse incorrecte que tous les appareils prennent en charge ce fournisseur de contenu non documenté et non pris en charge. Google a explicitement indiqué que faire appel à cette est pas une bonne idée: android-developers.blogspot.com/2010/05/...
CommonsWare
1
@Janusz: Il n'existe aucun moyen documenté et pris en charge qui fonctionne sur tous les clients SMS sur tous les appareils.
CommonsWare
9
@CommonsWare qui est triste à entendre. Il faudra peut-être alors vivre avec cette API.
Janusz
@Omer Une idée de la façon dont vous compteriez le nombre de messages SMS par contact?
SpicyWeenie
4
Le code a bougé. La recherche sur SmsPopupUtils.java m'a donné un nouveau lien vers celui-ci dans le code google. Dans le cas où ils le déplaceraient à nouveau ou l'arrêteraient complètement, voici un lien de sauvegarde - pastebin.com/iPt7MLyM
KalEl
25
À partir de l'API 19, vous pouvez utiliser la classe de téléphonie pour cela; Étant donné que les valeurs enregistrées en dur ne récupèrent pas les messages sur tous les appareils, car le fournisseur de contenu Uri change d'appareil et de fabricant.
publicvoid getAllSms(Context context){ContentResolver cr = context.getContentResolver();Cursor c = cr.query(Telephony.Sms.CONTENT_URI,null,null,null,null);int totalSMS =0;if(c !=null){
totalSMS = c.getCount();if(c.moveToFirst()){for(int j =0; j < totalSMS; j++){String smsDate = c.getString(c.getColumnIndexOrThrow(Telephony.Sms.DATE));String number = c.getString(c.getColumnIndexOrThrow(Telephony.Sms.ADDRESS));String body = c.getString(c.getColumnIndexOrThrow(Telephony.Sms.BODY));Date dateFormat=newDate(Long.valueOf(smsDate));String type;switch(Integer.parseInt(c.getString(c.getColumnIndexOrThrow(Telephony.Sms.TYPE)))){caseTelephony.Sms.MESSAGE_TYPE_INBOX:
type ="inbox";break;caseTelephony.Sms.MESSAGE_TYPE_SENT:
type ="sent";break;caseTelephony.Sms.MESSAGE_TYPE_OUTBOX:
type ="outbox";break;default:break;}
c.moveToNext();}}
c.close();}else{Toast.makeText(this,"No message to show!",Toast.LENGTH_SHORT).show();}}
Semble être la seule réponse qui n'utilise pas d'API non documentée et ne fait pas référence à des bibliothèques tierces.
Ishamael
J'ai essayé d'utiliser ce code pour obtenir des SMS à partir de Hangouts (qui est mon application SMS par défaut). Au lieu de cela, il a récupéré le dernier message sortant que j'ai envoyé via Messenger ... Savez-vous ce qui cause cela?
Miki P
@MikiP en utilisant mes pouvoirs de devinette, je dirai que l'application Messenger vous a demandé de remplacer la gestion des SMS par Messenger. Cela arrive avec une autre application de messagerie. Je n'ai pas d'autre explication.
m3nda
2
N'oubliez pas d'appeler c.close ();
Cícero Moura
1
@SardarAgabejli Si nous utilisons des valeurs enregistrées comme "contenturi: sms", ce ne sera pas le même pour tous les appareils, mais si nous utilisons la classe de téléphonie, nous obtenons un accès direct à cet uri conetnt ou au chemin du sms db de cet appareil, c'est une classe d'aide pour pointer vers la base de données de sms
Manoj Perumarath
23
Ce message est un peu ancien, mais voici une autre solution simple pour obtenir des données liées au SMSfournisseur de contenu dans Android:
Chaque Sms possède tous les champs, vous pouvez donc obtenir toutes les informations dont vous avez besoin: adresse, corps, date de réception, type (INBOX, SENT, DRAFT, ..), threadId, ...
Le code source et les exemples sur le github sont assez utiles. Il s'agit d'une bonne enveloppe / façade pour la plupart des fournisseurs courants. Je vous remercie.
m3nda
14
Étape 1: nous devons d'abord ajouter des autorisations dans le fichier manifeste comme
Eh bien ... est-ce ("com.aquadeals.seller.services.SmsReceiver") le nom de service commun?
m3nda
Ya qui n'est pas le nom du service, c'est le chemin de classe SmsReceiver dans mon application
Venkatesh
Pourquoi avoir besoin d'une autorisation pour LOCATION?
Zam Sunk
1
j'essaye de faire une application qui fait apparaître le contenu sms à l'utilisateur même si l'application a été tuée
Anjani Mittal
11
Il y a beaucoup de réponses déjà disponibles mais je pense que toutes manquent une partie importante de cette question. Avant de lire les données d'une base de données interne ou de sa table, nous devons comprendre comment les données y sont stockées et ensuite nous pouvons trouver la solution de la question ci-dessus qui est:
Comment puis-je lire les messages SMS de l'appareil par programmation dans Android?
Donc, dans la table SMS Android, c'est comme ça
Sachez que nous pouvons sélectionner ce que nous voulons dans la base de données. Dans notre cas, nous
identifiant, adresse et corps
En cas de lecture de SMS:
1.Demander des autorisations
int REQUEST_PHONE_CALL =1;if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_SMS)!=PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(MainActivity.this,newString[]{Manifest.permission.READ_SMS}, REQUEST_PHONE_CALL);}
Fournit une expérience utilisateur entièrement automatisée, sans obliger l'utilisateur à taper manuellement les codes de vérification et sans nécessiter d'autorisations d'application supplémentaires et doit être utilisé lorsque cela est possible. Cependant, il vous oblige à placer un code de hachage personnalisé dans le corps du message, vous devez donc également contrôler le côté serveur .
Exigences relatives aux messages - Code de hachage à 11 chiffres qui identifie de manière unique votre application
Ne nécessite pas le code de hachage personnalisé, mais oblige l'utilisateur à approuver la demande de votre application pour accéder au message contenant le code de vérification. Afin de minimiser les chances de faire apparaître le mauvais message à l'utilisateur, SMS User Consentfiltrera les messages des expéditeurs dans la liste des contacts de l'utilisateur.
Exigences relatives aux messages - Code alphanumérique de 4 à 10 chiffres contenant au moins un numéro
Conditions requises pour l'expéditeur - L'expéditeur ne peut pas figurer dans la liste des contacts de l'utilisateur
Interaction avec l'utilisateur - Un robinet pour approuver
The SMS User Consent APIfait partie des services Google Play. Pour l'utiliser, vous aurez besoin d'au moins une version 17.0.0de ces bibliothèques:
Le consentement de l'utilisateur SMS écoutera les messages SMS entrants contenant un code à usage unique pendant cinq minutes maximum. Il ne regardera aucun message envoyé avant son démarrage. Si vous connaissez le numéro de téléphone qui enverra le code à usage unique, vous pouvez spécifier le senderPhoneNumber, ou si vous ne nullcorrespondez à aucun numéro.
smsRetriever.startSmsUserConsent(senderPhoneNumber /* or null */)
Étape 2: demander le consentement pour lire un message
Une fois que votre application reçoit un message contenant un code à usage unique, elle sera notifiée par une diffusion. À ce stade, vous n'avez pas le consentement pour lire le message - à la place, vous obtenez un Intentque vous pouvez commencer à inviter l'utilisateur à donner son consentement. Dans votre BroadcastReceiver, vous affichez l'invite en utilisant le Intentdans le extras. Lorsque vous démarrez cette intention, il demandera à l'utilisateur l'autorisation de lire un seul message. Ils verront l'intégralité du texte qu'ils partageront avec votre application.
val consentIntent = extras.getParcelable<Intent>(SmsRetriever.EXTRA_CONSENT_INTENT)
startActivityForResult(consentIntent, SMS_CONSENT_REQUEST)
Étape 3: analyser le code unique et terminer la vérification SMS
Lorsque l'utilisateur clique “Allow”- il est temps de lire le message! À l'intérieur de onActivityResultvous, vous pouvez obtenir le texte intégral du message SMS à partir des données:
val message = data.getStringExtra(SmsRetriever.EXTRA_SMS_MESSAGE)
Vous analysez ensuite le message SMS et passez le code à usage unique à votre backend!
4-10 digit alphanumeric code containing at least one numberPouvez-vous expliquer ce que cela signifie? Cela signifie-t-il que la longueur du message entier doit être de 4 à 10 caractères uniquement du code sms?
Zeeshan Shabbir
Merci aussi
Levon Petrosyan
Cela ne fonctionne que pour la vérification OTP, non? Qu'en est-il de la lecture de tous les autres messages à l'intérieur du téléphone, de tous les SMS, etc.? Existe-t-il une nouvelle API pour cela, faites-le moi savoir. Bon codage! :)
Manoj Perumarath
Nous avons toujours eu l'erreur de timeout. S'il vous plaît aidez-moi
package utils.broadcastreceivers
import android.content.BroadcastReceiverimport android.content.Contextimport android.content.Intentimport android.telephony.SmsMessageimport android.util.LogclassMySMSBroadCastReceiver:BroadcastReceiver(){override fun onReceive(context:Context?, intent:Intent?){var body =""
val bundle = intent?.extras
val pdusArr = bundle!!.get("pdus")asArray<Any>var messages:Array<SmsMessage?>= arrayOfNulls(pdusArr.size)// if SMSis Long and contain more than 1 Message we'll read all of themfor(i in pdusArr.indices){
messages[i]=SmsMessage.createFromPdu(pdusArr[i]asByteArray)}varMobileNumber:String?= messages[0]?.originatingAddress
Log.i(TAG,"MobileNumber =$MobileNumber")
val bodyText =StringBuilder()for(i in messages.indices){
bodyText.append(messages[i]?.messageBody)}
body = bodyText.toString()if(body.isNotEmpty()){// Do something, save SMS in DB or variable , static object or .... Log.i("Inside Receiver :","body =$body")}}}
3-Obtenez l'autorisation SMS si Android 6 et supérieur:
if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.M &&ActivityCompat.checkSelfPermission(context!!,Manifest.permission.RECEIVE_SMS
)!=PackageManager.PERMISSION_GRANTED
){// Needs permission
requestPermissions(arrayOf(Manifest.permission.RECEIVE_SMS),
PERMISSIONS_REQUEST_READ_SMS
)}else{// Permission has already been granted}
4- Ajoutez ce code de demande à l'activité ou au fragment:
companion object{const val PERMISSIONS_REQUEST_READ_SMS =100}
5- Override Check permissionstion Request result fun:
override fun onRequestPermissionsResult(
requestCode:Int, permissions:Array<outString>,
grantResults:IntArray){when(requestCode){
PERMISSIONS_REQUEST_READ_SMS ->{if(grantResults[0]==PackageManager.PERMISSION_GRANTED){Log.i("BroadCastReceiver","PERMISSIONS_REQUEST_READ_SMS Granted")}else{// toast("Permission must be granted ")}}}}
Pour lire le sms j'ai écrit une fonction qui retourne un objet Conversation:
classConversation(val number:String, val message:List<Message>)classMessage(val number:String, val body:String, val date:Date)
fun getSmsConversation(context:Context, number:String?=null, completion:(conversations:List<Conversation>?)->Unit){
val cursor = context.contentResolver.query(Telephony.Sms.CONTENT_URI,null,null,null,null)
val numbers =ArrayList<String>()
val messages =ArrayList<Message>()var results =ArrayList<Conversation>()while(cursor !=null&& cursor.moveToNext()){
val smsDate = cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Sms.DATE))
val number = cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Sms.ADDRESS))
val body = cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Sms.BODY))
numbers.add(number)
messages.add(Message(number, body,Date(smsDate.toLong())))}
cursor?.close()
numbers.forEach { number ->if(results.find { it.number == number }==null){
val msg = messages.filter { it.number == number }
results.add(Conversation(number = number, message = msg))}}if(number !=null){
results = results.filter { it.number == number }asArrayList<Conversation>}
completion(results)}
Réponses:
Utilisez Content Resolver ( "content: // sms / mailbox" ) pour lire les SMS qui se trouvent dans la boîte de réception.
Veuillez ajouter l' autorisation READ_SMS .
J'espère que ça aide :)
la source
moveToFirst
comme moi.Définir l'application comme application SMS par défaut
Fonction pour recevoir des SMS
La classe SMS est ci-dessous:
N'oubliez pas de définir l'autorisation dans votre AndroidManifest.xml
la source
String receiveDayTime = Functions.dateFromMilisec(Long.valueOf(c.getColumnIndexOrThrow("date")), "hh:mm a MMM dd, yyyy");
new SimpleDateFormat("hh:mm", Locale.US).format(new Date(Long.parseLong(_time)));
Cela vous donnera 24 heures.mActivity
n'est pas défini. Qu'est-ce que c'est?C'est un processus trivial. Vous pouvez voir un bon exemple dans le code source SMSPopup
Examinez les méthodes suivantes:
c'est la méthode de lecture:
la source
À partir de l'API 19, vous pouvez utiliser la classe de téléphonie pour cela; Étant donné que les valeurs enregistrées en dur ne récupèrent pas les messages sur tous les appareils, car le fournisseur de contenu Uri change d'appareil et de fabricant.
la source
Ce message est un peu ancien, mais voici une autre solution simple pour obtenir des données liées au
SMS
fournisseur de contenu dans Android:Utilisez cette lib: https://github.com/EverythingMe/easy-content-providers
Obtenez tout
SMS
:Chaque Sms possède tous les champs, vous pouvez donc obtenir toutes les informations dont vous avez besoin:
adresse, corps, date de réception, type (INBOX, SENT, DRAFT, ..), threadId, ...
Gel tout
MMS
:Gel tout
Thread
:Gel tout
Conversation
:Il fonctionne avec
List
ouCursor
et il existe un exemple d'application pour voir à quoi il ressemble et fonctionne.En fait, il existe un support pour tous les fournisseurs de contenu Android tels que: contacts, journaux d'appels, calendrier, ... Doc complet avec toutes les options: https://github.com/EverythingMe/easy-content-providers/wiki/Android- fournisseurs
J'espère que cela a également aidé :)
la source
Étape 1: nous devons d'abord ajouter des autorisations dans le fichier manifeste comme
Étape 2: puis ajoutez la classe de récepteur SMS de service pour recevoir des SMS
Étape 3: ajouter l'autorisation d'exécution
Étape 4: Ajoutez ces classes dans votre application et testez la classe Interface
SmsReceiver.java
la source
Il y a beaucoup de réponses déjà disponibles mais je pense que toutes manquent une partie importante de cette question. Avant de lire les données d'une base de données interne ou de sa table, nous devons comprendre comment les données y sont stockées et ensuite nous pouvons trouver la solution de la question ci-dessus qui est:
Comment puis-je lire les messages SMS de l'appareil par programmation dans Android?
Donc, dans la table SMS Android, c'est comme ça
Sachez que nous pouvons sélectionner ce que nous voulons dans la base de données. Dans notre cas, nous
En cas de lecture de SMS:
1.Demander des autorisations
ou
Maintenant, votre code va comme ça
J'espère que celui-ci vous sera utile. Merci.
la source
Les services Google Play disposent de deux API que vous pouvez utiliser pour rationaliser le processus de vérification par SMS
API SMS Retriever
Fournit une expérience utilisateur entièrement automatisée, sans obliger l'utilisateur à taper manuellement les codes de vérification et sans nécessiter d'autorisations d'application supplémentaires et doit être utilisé lorsque cela est possible. Cependant, il vous oblige à placer un code de hachage personnalisé dans le corps du message, vous devez donc également contrôler le côté serveur .
Demander une vérification par SMS dans une application Android
Effectuer une vérification SMS sur un serveur
API de consentement de l'utilisateur SMS
Ne nécessite pas le code de hachage personnalisé, mais oblige l'utilisateur à approuver la demande de votre application pour accéder au message contenant le code de vérification. Afin de minimiser les chances de faire apparaître le mauvais message à l'utilisateur,
SMS User Consent
filtrera les messages des expéditeurs dans la liste des contacts de l'utilisateur.The SMS User Consent API
fait partie des services Google Play. Pour l'utiliser, vous aurez besoin d'au moins une version17.0.0
de ces bibliothèques:Étape 1: Commencez à écouter les messages SMS
Le consentement de l'utilisateur SMS écoutera les messages SMS entrants contenant un code à usage unique pendant cinq minutes maximum. Il ne regardera aucun message envoyé avant son démarrage. Si vous connaissez le numéro de téléphone qui enverra le code à usage unique, vous pouvez spécifier le
senderPhoneNumber
, ou si vous nenull
correspondez à aucun numéro.Étape 2: demander le consentement pour lire un message
Une fois que votre application reçoit un message contenant un code à usage unique, elle sera notifiée par une diffusion. À ce stade, vous n'avez pas le consentement pour lire le message - à la place, vous obtenez un
Intent
que vous pouvez commencer à inviter l'utilisateur à donner son consentement. Dans votreBroadcastReceiver
, vous affichez l'invite en utilisant leIntent
dans leextras
. Lorsque vous démarrez cette intention, il demandera à l'utilisateur l'autorisation de lire un seul message. Ils verront l'intégralité du texte qu'ils partageront avec votre application.Étape 3: analyser le code unique et terminer la vérification SMS
Lorsque l'utilisateur clique
“Allow”
- il est temps de lire le message! À l'intérieur deonActivityResult
vous, vous pouvez obtenir le texte intégral du message SMS à partir des données:Vous analysez ensuite le message SMS et passez le code à usage unique à votre backend!
la source
4-10 digit alphanumeric code containing at least one number
Pouvez-vous expliquer ce que cela signifie? Cela signifie-t-il que la longueur du message entier doit être de 4 à 10 caractères uniquement du code sms?changé par:
la source
Code Kotlin pour lire les SMS:
1- Ajoutez cette autorisation à AndroidManifest.xml:
2-Créez une classe BroadCastreceiver:
3-Obtenez l'autorisation SMS si Android 6 et supérieur:
4- Ajoutez ce code de demande à l'activité ou au fragment:
5- Override Check permissionstion Request result fun:
la source
La fonction la plus simple
Pour lire le sms j'ai écrit une fonction qui retourne un objet Conversation:
En utilisant:
Ou obtenez uniquement la conversation d'un numéro spécifique:
la source