Sur*_* TR 150
使用内容解析器("content:// sms/inbox")来读取收件箱中的SMS.
// 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 exception
do {
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
}
Run Code Online (Sandbox Code Playgroud)
请添加READ_SMS权限.
我希望它有帮助:)
Ati*_*ood 76
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
final String myPackageName = getPackageName();
if (!Telephony.Sms.getDefaultSmsPackage(this).equals(myPackageName)) {
Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, myPackageName);
startActivityForResult(intent, 1);
}else {
List<Sms> lst = getAllSms();
}
}else {
List<Sms> lst = getAllSms();
}
Run Code Online (Sandbox Code Playgroud)
将应用设置为默认短信应用
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if (resultCode == RESULT_OK) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
final String myPackageName = getPackageName();
if (Telephony.Sms.getDefaultSmsPackage(mActivity).equals(myPackageName)) {
List<Sms> lst = getAllSms();
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
获取短信的功能
public List<Sms> getAllSms() {
List<Sms> lstSms = new ArrayList<Sms>();
Sms objSms = new Sms();
Uri message = Uri.parse("content://sms/");
ContentResolver cr = mActivity.getContentResolver();
Cursor c = cr.query(message, null, null, null, null);
mActivity.startManagingCursor(c);
int totalSMS = c.getCount();
if (c.moveToFirst()) {
for (int i = 0; i < totalSMS; i++) {
objSms = new Sms();
objSms.setId(c.getString(c.getColumnIndexOrThrow("_id")));
objSms.setAddress(c.getString(c
.getColumnIndexOrThrow("address")));
objSms.setMsg(c.getString(c.getColumnIndexOrThrow("body")));
objSms.setReadState(c.getString(c.getColumnIndex("read")));
objSms.setTime(c.getString(c.getColumnIndexOrThrow("date")));
if (c.getString(c.getColumnIndexOrThrow("type")).contains("1")) {
objSms.setFolderName("inbox");
} else {
objSms.setFolderName("sent");
}
lstSms.add(objSms);
c.moveToNext();
}
}
// else {
// throw new RuntimeException("You have no SMS");
// }
c.close();
return lstSms;
}
Run Code Online (Sandbox Code Playgroud)
短信课程如下:
public class Sms{
private String _id;
private String _address;
private String _msg;
private String _readState; //"0" for have not read sms and "1" for have read sms
private String _time;
private String _folderName;
public String getId(){
return _id;
}
public String getAddress(){
return _address;
}
public String getMsg(){
return _msg;
}
public String getReadState(){
return _readState;
}
public String getTime(){
return _time;
}
public String getFolderName(){
return _folderName;
}
public void setId(String id){
_id = id;
}
public void setAddress(String address){
_address = address;
}
public void setMsg(String msg){
_msg = msg;
}
public void setReadState(String readState){
_readState = readState;
}
public void setTime(String time){
_time = time;
}
public void setFolderName(String folderName){
_folderName = folderName;
}
}
Run Code Online (Sandbox Code Playgroud)
不要忘记在AndroidManifest.xml中定义权限
<uses-permission android:name="android.permission.READ_SMS" />
Run Code Online (Sandbox Code Playgroud)
Öme*_*mer 61
这是一个微不足道的过程.您可以在源代码SMSPopup中看到一个很好的示例
检查以下方法:
SmsMmsMessage getSmsDetails(Context context, long ignoreThreadId, boolean unreadOnly)
long findMessageId(Context context, long threadId, long _timestamp, int messageType
void setMessageRead(Context context, long messageId, int messageType)
void deleteMessage(Context context, long messageId, long threadId, int messageType)
Run Code Online (Sandbox Code Playgroud)
这是阅读方法:
SmsMmsMessage getSmsDetails(Context context,
long ignoreThreadId, boolean unreadOnly)
{
String SMS_READ_COLUMN = "read";
String WHERE_CONDITION = unreadOnly ? SMS_READ_COLUMN + " = 0" : null;
String SORT_ORDER = "date DESC";
int count = 0;
// Log.v(WHERE_CONDITION);
if (ignoreThreadId > 0) {
// Log.v("Ignoring sms threadId = " + ignoreThreadId);
WHERE_CONDITION += " AND thread_id != " + ignoreThreadId;
}
Cursor cursor = context.getContentResolver().query(
SMS_INBOX_CONTENT_URI,
new String[] { "_id", "thread_id", "address", "person", "date", "body" },
WHERE_CONDITION,
null,
SORT_ORDER);
if (cursor != null) {
try {
count = cursor.getCount();
if (count > 0) {
cursor.moveToFirst();
// String[] columns = cursor.getColumnNames();
// for (int i=0; i<columns.length; i++) {
// Log.v("columns " + i + ": " + columns[i] + ": " + cursor.getString(i));
// }
long messageId = cursor.getLong(0);
long threadId = cursor.getLong(1);
String address = cursor.getString(2);
long contactId = cursor.getLong(3);
String contactId_string = String.valueOf(contactId);
long timestamp = cursor.getLong(4);
String body = cursor.getString(5);
if (!unreadOnly) {
count = 0;
}
SmsMmsMessage smsMessage = new SmsMmsMessage(context, address,
contactId_string, body, timestamp,
threadId, count, messageId, SmsMmsMessage.MESSAGE_TYPE_SMS);
return smsMessage;
}
} finally {
cursor.close();
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
sro*_*mku 22
这篇文章有点旧,但这是另一个简单的解决方案,用于SMS在Android中获取与内容提供商相关的数据:
使用此库:https://github.com/EverythingMe/easy-content-providers
全部获得SMS:
TelephonyProvider telephonyProvider = new TelephonyProvider(context);
List<Sms> smses = telephonyProvider.getSms(Filter.ALL).getList();
Run Code Online (Sandbox Code Playgroud)
每个Sms都包含所有字段,因此您可以获得所需的任何信息:
地址,正文,接收日期,类型(INBOX,SENT,DRAFT,..),threadId,...
凝胶全部MMS:
List<Mms> mmses = telephonyProvider.getMms(Filter.ALL).getList();
Run Code Online (Sandbox Code Playgroud)凝胶全部Thread:
List<Thread> threads = telephonyProvider.getThreads().getList();
Run Code Online (Sandbox Code Playgroud)凝胶全部Conversation:
List<Conversation> conversations = telephonyProvider.getConversations().getList();
Run Code Online (Sandbox Code Playgroud)它适用于List或者Cursor有一个示例应用程序,以查看它的外观和工作方式.
事实上,所有Android内容提供商都支持:联系人,通话记录,日历,... 所有选项的完整文档:https://github.com/EverythingMe/easy-content-providers/wiki/Android-供应商
希望它也有帮助:)
Man*_*ath 20
从API 19开始,您可以使用Telephony Class; 由于硬编码值不会检索每个设备中的消息,因为内容提供商Uri从设备和制造商更改.
public void 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= new Date(Long.valueOf(smsDate));
String type;
switch (Integer.parseInt(c.getString(c.getColumnIndexOrThrow(Telephony.Sms.TYPE)))) {
case Telephony.Sms.MESSAGE_TYPE_INBOX:
type = "inbox";
break;
case Telephony.Sms.MESSAGE_TYPE_SENT:
type = "sent";
break;
case Telephony.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();
}
}
Run Code Online (Sandbox Code Playgroud)
Ven*_*esh 14
第1步:首先我们必须在清单文件中添加权限
<uses-permission android:name="android.permission.RECEIVE_SMS" android:protectionLevel="signature" />
<uses-permission android:name="android.permission.READ_SMS" />
Run Code Online (Sandbox Code Playgroud)
步骤2:然后添加服务短信接收器类用于接收短信
<receiver android:name="com.aquadeals.seller.services.SmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
第3步:添加运行时权限
private boolean checkAndRequestPermissions()
{
int sms = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS);
if (sms != PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS}, REQUEST_ID_MULTIPLE_PERMISSIONS);
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
第4步:在您的应用程序中添加此类并测试 Interface类
public interface SmsListener {
public void messageReceived(String messageText);
}
Run Code Online (Sandbox Code Playgroud)
SmsReceiver.java
public class SmsReceiver extends BroadcastReceiver {
private static SmsListener mListener;
public Pattern p = Pattern.compile("(|^)\\d{6}");
@Override
public void onReceive(Context context, Intent intent) {
Bundle data = intent.getExtras();
Object[] pdus = (Object[]) data.get("pdus");
for(int i=0;i<pdus.length;i++)
{
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i]);
String sender = smsMessage.getDisplayOriginatingAddress();
String phoneNumber = smsMessage.getDisplayOriginatingAddress();
String senderNum = phoneNumber ;
String messageBody = smsMessage.getMessageBody();
try
{
if(messageBody!=null){
Matcher m = p.matcher(messageBody);
if(m.find()) {
mListener.messageReceived(m.group(0)); }
else {}} }
catch(Exception e){} } }
public static void bindListener(SmsListener listener) {
mListener = listener; }}
Run Code Online (Sandbox Code Playgroud)
小智 7
已经有很多答案,但是我认为所有这些答案都缺少这个问题的重要部分。在从内部数据库或其表中读取数据之前,我们必须了解如何在内部数据库中存储数据,然后才能找到上述问题的解决方案:
如何在Android中以编程方式从设备读取SMS消息?
因此,在android SMS表中是这样的
知道,我们可以从数据库中选择所需的内容。在我们的情况下,我们只需要
ID,地址和正文
如果阅读短信:
1.询问权限
int REQUEST_PHONE_CALL = 1;
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_SMS}, REQUEST_PHONE_CALL);
}
Run Code Online (Sandbox Code Playgroud)
要么
<uses-permission android:name="android.permission.READ_SMS" />
Run Code Online (Sandbox Code Playgroud)
2.现在你的代码是这样的
// Create Inbox box URI
Uri inboxURI = Uri.parse("content://sms/inbox");
// List required columns
String[] reqCols = new String[]{"_id", "address", "body"};
// Get Content Resolver object, which will deal with Content Provider
ContentResolver cr = getContentResolver();
// Fetch Inbox SMS Message from Built-in Content Provider
Cursor c = cr.query(inboxURI, reqCols, null, null, null);
// Attached Cursor with adapter and display in listview
adapter = new SimpleCursorAdapter(this, R.layout.a1_row, c,
new String[]{"body", "address"}, new int[]{
R.id.A1_txt_Msg, R.id.A1_txt_Number});
lst.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)
我希望这会有所帮助。谢谢。
Google Play 服务有两个 API,可用于简化基于 SMS 的验证过程
提供完全自动化的用户体验,无需用户手动输入验证码,无需任何额外的应用程序权限,应尽可能使用。但是,它确实需要您在消息正文中放置自定义哈希码,因此您也必须控制服务器端。
不需要自定义哈希码,但需要用户批准您的应用程序访问包含验证码的消息的请求。为了尽量减少向用户显示错误消息的机会,SMS User Consent将在用户的联系人列表中过滤掉来自发件人的消息。
The SMS User Consent API是 Google Play 服务的一部分。要使用它,您至少需要17.0.0这些库的版本:
implementation "com.google.android.gms:play-services-auth:17.0.0"
implementation "com.google.android.gms:play-services-auth-api-phone:17.1.0"
Run Code Online (Sandbox Code Playgroud)
第 1 步:开始侦听 SMS 消息
SMS 用户同意将侦听包含一次性代码的传入 SMS 消息长达五分钟。它不会查看在启动之前发送的任何消息。如果您知道将发送一次性代码的电话号码,您可以指定senderPhoneNumber,否则null将匹配任何号码。
smsRetriever.startSmsUserConsent(senderPhoneNumber /* or null */)
Run Code Online (Sandbox Code Playgroud)
第 2 步:请求同意阅读消息
一旦您的应用收到一条包含一次性代码的消息,它就会收到广播通知。在这一点上,您没有同意阅读该消息——相反,您会得到一个Intent,您可以开始提示用户同意。里面您BroadcastReceiver,您可以使用显示提示Intent中extras。当您启动该意图时,它会提示用户授予阅读单条消息的权限。他们将看到他们将与您的应用共享的整个文本。
val consentIntent = extras.getParcelable<Intent>(SmsRetriever.EXTRA_CONSENT_INTENT)
startActivityForResult(consentIntent, SMS_CONSENT_REQUEST)
Run Code Online (Sandbox Code Playgroud)
第三步:解析一次性代码并完成短信验证
当用户点击时“Allow”——是时候真正阅读消息了!在里面onActivityResult你可以从数据中获取短信的全文:
val message = data.getStringExtra(SmsRetriever.EXTRA_SMS_MESSAGE)
Run Code Online (Sandbox Code Playgroud)
然后您解析 SMS 消息并将一次性代码传递给您的后端!
| 归档时间: |
|
| 查看次数: |
315641 次 |
| 最近记录: |