Android 开发之旅:短信的收发及在android模拟器之间实践(一)

android模拟器发送短信 编程建立一个短信发送界面。提供输入手机号码和短信内容,利用系统服务, 发送短信内容到另一个模拟器。 代码 布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools=" 阅读详情
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://skynet.blog.51cto.com/1943397/363493
引言

本文通过运行两个Android模拟器,介绍在Android中如何实现短信服务(SMS,short message service)的功能。通过这个例子,我想带给大家的是:更加熟悉之前介绍过的Android应用程序的概念及技术细节,且通过实例调度大家的兴趣。我之所以选择SMS为例子,主要原因是SMS已经非常成熟了,从中可以发掘更多的信息和技术细节,而且我相信大部分人发短信比打电话多。

本文的主要内容如下:

  1. 1、温故知新
  2. 2、准备工作:SMS涉及的主要类SmsManager
  3. 3、简单的SMS发送程序
    1. 3.1、运行SMS程序给另一个android模拟器发短
  4. 4、SMS增强(一)
  5. 5、SMS增强(二)
  6. 6、SMS接收程序(下篇)
  7. 7、emulator工具(下篇)
  8. 8、…
1、温故知新

广播接收者:一个广播接收者是这样一个组件,它不做什么事,仅是接受广播公告并作出相应的反应。许多广播源自于系统代码,例如公告时区的改变、电池电量低、已采取图片、用户改变了语言偏好。应用程序也可以发起广播,例如为了他其他程序知道某些数据已经下载到设备且他们可以使用这些数据

BroadcastReceiver类:是接受sendBroadcast()发送的意图(intents)的基类。可以用Context.registerReceiver()动态地注册这个类的实例,或者通过AndroidManifest.xml中<receiver>标签静态发布。

广播接收者不显示一个用户界面。然而,它们启动一个活动去响应收到的信息,或者他们可能使用NotificationManager去通知用户。通知可以使用多种方式获得用户的注意——闪烁的背光、振动设备、播放声音等等。典型的是放在一个持久的图标在状态栏,用户可以打开获取信息。

2、准备工作:SMS涉及的主要类SmsManager

实现SMS主要用到SmsManager类,该类继承自java.lang.Object类,下面我们介绍一下该类的主要成员。

公有方法:

  1. ArrayList<String> divideMessage(String text)
    当短信超过SMS消息的最大长度时,将短信分割为几块。
    参数:text——初始的消息,不能为空
    返回值:有序的ArrayList<String>,可以重新组合为初始的消息
  2. static SmsManager getDefault()
    获取SmsManager的默认实例。
    返回值:SmsManager的默认实例
  3. void SendDataMessage(String destinationAddress, String scAddress, short destinationPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent)
    发送一个基于SMS的数据到指定的应用程序端口。
    参数:
    1)、destinationAddress——消息的目标地址
    2)、scAddress——服务中心的地址or为空使用当前默认的SMSC 3)destinationPort——消息的目标端口号
    4)、data——消息的主体,即消息要发送的数据
    5)、sentIntent——如果不为空,当消息成功发送或失败这个PendingIntent就广播。结果代码是Activity.RESULT_OK表示成功,或RESULT_ERROR_GENERIC_FAILURE、RESULT_ERROR_RADIO_OFF、RESULT_ERROR_NULL_PDU之一表示错误。对应RESULT_ERROR_GENERIC_FAILURE,sentIntent可能包括额外的“错误代码”包含一个无线电广播技术特定的值,通常只在修复故障时有用。
    每一个基于SMS的应用程序控制检测sentIntent。如果sentIntent是空,调用者将检测所有未知的应用程序,这将导致在检测的时候发送较小数量的SMS。
    6)、deliveryIntent——如果不为空,当消息成功传送到接收者这个PendingIntent就广播。
    异常:如果destinationAddress或data是空时,抛出IllegalArgumentException异常。
  4. void sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent>  deliverIntents)
    发送一个基于SMS的多部分文本,调用者应用已经通过调用divideMessage(String text)将消息分割成正确的大小。
    参数:
    1)、destinationAddress——消息的目标地址
    2)、scAddress——服务中心的地址or为空使用当前默认的SMSC
    3)、parts——有序的ArrayList<String>,可以重新组合为初始的消息
    4)、sentIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent
    5)、deliverIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent
    异常:如果destinationAddress或data是空时,抛出IllegalArgumentException异常。
  5. void sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)
    发送一个基于SMS的文本。参数的意义和异常前面的已存在的一样,不再累述。

常量:

  1. public static final int RESULT_ERROR_GENERIC_FAILURE
    表示普通错误,值为1(0x00000001)
  2. public static final int RESULT_ERROR_NO_SERVICE
    表示服务当前不可用,值为4 (0x00000004)
  3. public static final int RESULT_ERROR_NULL_PDU
    表示没有提供pdu,值为3 (0x00000003)
  4. public static final int RESULT_ERROR_RADIO_OFF
    表示无线广播被明确地关闭,值为2 (0x00000002)
  5. public static final int STATUS_ON_ICC_FREE
    表示自由空间,值为0 (0x00000000)
  6. public static final int STATUS_ON_ICC_READ
    表示接收且已读,值为1 (0x00000001)
  7. public static final int STATUS_ON_ICC_SENT
    表示存储且已发送,值为5 (0x00000005)
  8. public static final int STATUS_ON_ICC_UNREAD
    表示接收但未读,值为3 (0x00000003)
  9. public static final int STATUS_ON_ICC_UNSENT
    表示存储但为发送,值为7 (0x00000007)
3、简单的SMS发送程序

1)、首先,编辑布局文件res/layout/main.xml,达到我们想要的结果,界面如下:

Android 开发之旅:短信的收发及在android模拟器之间实践(一)

图1、程序运行界面

 对应的xml代码如下:

  
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:orientation="vertical"   
  4.     android:layout_width="fill_parent" 
  5.     android:layout_height="fill_parent" > 
  6.     <TextView android:layout_width="fill_parent" 
  7.             android:layout_height="wrap_content"   
  8.             android:text="@string/txtPhoneNo"/>    <!-- text's value define in res/values/strings.xml --> 
  9.       
  10.     <EditText android:layout_width="fill_parent" 
  11.             android:layout_height="wrap_content" 
  12.             android:id="@+id/edtPhoneNo"/> 
  13.       
  14.     <TextView android:layout_width="fill_parent" 
  15.             android:layout_height="wrap_content" 
  16.             android:text="@string/txtContent"/> 
  17.       
  18.     <EditText android:layout_width="fill_parent" 
  19.             android:layout_height="wrap_content" 
  20.             android:minLines="3" 
  21.             android:id="@+id/edtContent"/> 
  22.      
  23.     <Button android:layout_width="wrap_content" 
  24.             android:layout_height="wrap_content" 
  25.             android:text="@string/btnText" 
  26.             android:id="@+id/btnSend"/> 
  27. </LinearLayout> 

相应的要在res/values/strings.xm中添加上面定义的视图的text的值,如下:

  
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources> 
  3.     <string name="txtPhoneNo">Please input phone NO:</string> 
  4.     <string name="txtContent">Please input SMS\'s content:</string> 
  5.     <string name="btnText">send!</string> 
  6.     <string name="app_name">SMS</string> 
  7. </resources> 

2)、做完这些准备工作之后,我么要开始编写代码实现简单的短信发送了。

通过第一步我们构建好界面之后,现在要在上面的基础上编写业务逻辑了。大致过程为:在java源文件中,获取用户在edtPhoneNo中输入的电话号码,edtContent中输入要发送的内容;然后点击btnSend按钮发送短信,要达到这个目的我们要设置btnSend的OnClickListener以达到当点击它触发发送短信的功能,而且要发送短信就要用到我们前面介绍的SmsManager类提供的方法接口。

设置btnSend的OnClickListener的代码如下:

  
  1. btnSend.setOnClickListener(new View.OnClickListener() {  
  2.     public void onClick(View v) {  
  3.         String phoneNo = edtPhoneNo.getText().toString();  
  4.         String message = edtContent.getText().toString();  
  5.         if (phoneNo.length() > 0 && message.length() > 0){  
  6.             //call sendSMS to send message to phoneNo  
  7.             sendSMS(phoneNo, message);  
  8.         }  
  9.         else 
  10.             Toast.makeText(getBaseContext(),  
  11.                 "Please enter both phone number and message.",  
  12.                 Toast.LENGTH_SHORT).show();  
  13.     }  
  14. }); 

发送短信的功能的代码如下:

  
  1. private void sendSMS(String phoneNumber, String message) {  
  2.     // ---sends an SMS message to another device---  
  3.     SmsManager sms = SmsManager.getDefault();  
  4.     PendingIntent pi = PendingIntent.getActivity(this, 0,                new Intent(this,TextMessage.class), 0);  
  5.     //if message's length more than 70 ,  
  6.     //then call divideMessage to dive message into several part         //and call sendTextMessage()  
  7.     //else direct call sendTextMessage()  
  8.     if (message.length() > 70) {  
  9.         ArrayList<String> msgs = sms.divideMessage(message);  
  10.         for (String msg : msgs) {  
  11.             sms.sendTextMessage(phoneNumber, null, msg, pi, null);  
  12.         }  
  13.     } else {  
  14.         sms.sendTextMessage(phoneNumber, null, message, pi, null);  
  15.     }  
  16.     Toast.makeText(TextMessage.this, "短信发送完成", Toast.LENGTH_LONG).show();  
  17. } 

如果你已经看了第2节介绍的SmsManager类的介绍,代码应该很好理解。在这里要说明的是,sendTextMessage方法中的第4个和第5个参数PendingIntent设为null,这样的话不能根据短信发出之后的状态做相应的事情,如短信发送失败后的提醒、接收者成功接收后的回执……完整的流程源码如下:

  
  1. package skynet.com.cnblogs.www;  
  2.  
  3. import java.util.ArrayList;  
  4.  
  5. import android.app.Activity;  
  6. import android.app.PendingIntent;  
  7. import android.content.Intent;  
  8. import android.os.Bundle;  
  9. import android.telephony.SmsManager;  
  10. import android.view.View;  
  11. import android.widget.*;  
  12.  
  13. public class TextMessage extends Activity {  
  14.     /** Called when the activity is first created. */ 
  15.     @Override 
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.  
  19.         setContentView(R.layout.main);  
  20.         btnSend = (Button) findViewById(R.id.btnSend);  
  21.         edtPhoneNo = (EditText) findViewById(R.id.edtPhoneNo);  
  22.         edtContent = (EditText) findViewById(R.id.edtContent);  
  23.  
  24.         btnSend.setOnClickListener(new View.OnClickListener() {  
  25.             public void onClick(View v) {  
  26.                 String phoneNo = edtPhoneNo.getText().toString();  
  27.                 String message = edtContent.getText().toString();  
  28.                 if (phoneNo.length() > 0 && message.length() > 0) {  
  29.                     // call sendSMS to send message to phoneNo  
  30.                     sendSMS(phoneNo, message);  
  31.                 } else 
  32.                     Toast.makeText(getBaseContext(),  
  33.                             "Please enter both phone number and message.",  
  34.                             Toast.LENGTH_SHORT).show();  
  35.             }  
  36.         });  
  37.     }  
  38.  
  39.     private Button btnSend;  
  40.     private EditText edtPhoneNo;  
  41.     private EditText edtContent;  
  42.  
  43.     private void sendSMS(String phoneNumber, String message) {  
  44.         // ---sends an SMS message to another device---  
  45.         SmsManager sms = SmsManager.getDefault();  
  46.         PendingIntent pi = PendingIntent.getActivity(this, 0, new Intent(this,  
  47.                 TextMessage.class), 0);  
  48.         // if message's length more than 70 ,  
  49.         // then call divideMessage to dive message into several part ,and call  
  50.         // sendTextMessage()  
  51.         // else direct call sendTextMessage()  
  52.         if (message.length() > 70) {  
  53.             ArrayList<String> msgs = sms.divideMessage(message);  
  54.             for (String msg : msgs) {  
  55.                 sms.sendTextMessage(phoneNumber, null, msg, pi, null);  
  56.             }  
  57.         } else {  
  58.             sms.sendTextMessage(phoneNumber, null, message, pi, null);  
  59.         }  
  60.         Toast.makeText(TextMessage.this, "短信发送完成", Toast.LENGTH_LONG).show();  
  61.     }  
  62. } 

3)运行前,还要在清单文件AndroidManifest.xml中加入允许发送短信的权限:

  
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3.       package="skynet.com.cnblogs.www" 
  4.       android:versionCode="1" 
  5.       android:versionName="1.0"> 
  6.     <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  7.         <activity android:name=".TextMessage" 
  8.                   android:label="@string/app_name"> 
  9.             <intent-filter> 
  10.                 <action android:name="android.intent.action.MAIN" /> 
  11.                 <category android:name="android.intent.category.LAUNCHER" /> 
  12.             </intent-filter> 
  13.         </activity> 
  14.  
  15.     </application> 
  16.     <uses-permission android:name="android.permission.SEND_SMS"/> 
  17. </manifest>  
3.1、运行SMS程序给另一个android模拟器发短信

运行上面我们编写的TextMessage程序,另外在Windows的命令行下切换到tools目录下,并输入emulator –data smsReceiver,我的如下:

Android 开发之旅:短信的收发及在android模拟器之间实践(一)

这样就会启动一个android模拟器,如下所示:(注意它的编号:5556,就是用这个编号与它通信的)

Android 开发之旅:短信的收发及在android模拟器之间实践(一)

图2、通过emulator启动一个android模拟器

通过我们TextMessage程序启动的android模拟器,编写短信:

Android 开发之旅:短信的收发及在android模拟器之间实践(一)

图3、TextMessage程序个5556模拟器发短信

点击发送之后,通过命令行启动的5556号android模拟器会收到我们刚才发送的短信,如下所示:

Android 开发之旅:短信的收发及在android模拟器之间实践(一)

图4、收到短信的提示

tips:

如果通过命令行的emulator启动android模拟器提示“NO DNS servers found!”,这时我们发的短信模拟器是收不到的。

  1. 在Windows下,如果电脑没有介入网络,即找不DNS服务器的话会出现这种情况!
  2. 在Mac下,如果提示这个警告的话,可以这样解决:检查你是否有 /etc/resolv.conf文件,如果没有的话,通过下面的命令行
    ln -s /private/var/run/resolv.conf /etc/resolv.conf可以解决。
4、SMS增强(一)

上面我们实现了一个简单的SMS程序,下面我们要对它进行增强!你肯定已经注意到了,我们上面的SMS程序的sendTextMessage方法中的第4个和第5个参数PendingIntent设为null,即sentIntent和deliveryIntent。

第4个参数-sendIntent,当消息成功发送或发送失败都将被触发。广播接收者的结果码,Activity.RESULT_OK表示成功,或RESULT_ERROR_GENERIC_FAILURE、RESULT_ERROR_RADIO_OFF、RESULT_ERROR_NULL_PDU之一表示错误。对应RESULT_ERROR_GENERIC_FAILURE,sentIntent可能包括额外的“错误代码”包含一个无线电广播技术特定的值,通常只在修复故障时有用。第5个参数-deliveryIntent,仅当目标接收到你的SMS消息才触发。

为了跟踪发出的短信的状态,实现和注册Broadcast Receiver(广播接收者)监听传递给sendTextMessage方法的参数Pending Intents。下面我们就实现和注册这个广播接收者:

  
  1. String SENT_SMS_ACTION="SENT_SMS_ACTION";  
  2. String DELIVERED_SMS_ACTION="DELIVERED_SMS_ACTION";  
  3.  
  4. //create the sentIntent parameter  
  5. Intent sentIntent=new Intent(SENT_SMS_ACTION);  
  6. PendingIntent sentPI=PendingIntent.getBroadcast(  
  7.         this,  
  8.         0,   
  9.         sentIntent,   
  10.         0);  
  11.  
  12. //create the deilverIntent parameter  
  13. Intent deliverIntent=new Intent(DELIVERED_SMS_ACTION);  
  14. PendingIntent deliverPI=PendingIntent.getBroadcast(  
  15.         this,  
  16.         0,   
  17.         deliverIntent,   
  18.         0);  
  19.  
  20. //register the Broadcast Receivers  
  21. registerReceiver(new BroadcastReceiver(){  
  22.     @Override 
  23.     public void onReceive(Context _context,Intent _intent)  
  24.     {  
  25.         switch(getResultCode()){  
  26.             case Activity.RESULT_OK:  
  27.                 Toast.makeText(getBaseContext(),   
  28.                         "SMS sent success actions",  
  29.                         Toast.LENGTH_SHORT).show();  
  30.                 break;  
  31.             case SmsManager.RESULT_ERROR_GENERIC_FAILURE:  
  32.                 Toast.makeText(getBaseContext(),   
  33.                         "SMS generic failure actions",  
  34.                         Toast.LENGTH_SHORT).show();  
  35.                 break;  
  36.             case SmsManager.RESULT_ERROR_RADIO_OFF:  
  37.                 Toast.makeText(getBaseContext(),  
  38.                         "SMS radio off failure actions",  
  39.                         Toast.LENGTH_SHORT).show();  
  40.                 break;  
  41.             case SmsManager.RESULT_ERROR_NULL_PDU:  
  42.                 Toast.makeText(getBaseContext(),   
  43.                         "SMS null PDU failure actions",  
  44.                         Toast.LENGTH_SHORT).show();  
  45.                 break;  
  46.         }  
  47.     }  
  48. },  
  49. new IntentFilter(SENT_SMS_ACTION));  
  50. registerReceiver(new BroadcastReceiver(){  
  51.     @Override 
  52.     public void onReceive(Context _context,Intent _intent)  
  53.     {  
  54.         Toast.makeText(getBaseContext(),   
  55.                 "SMS delivered actions",  
  56.                 Toast.LENGTH_SHORT).show();               
  57.     }  
  58. },  
  59. new IntentFilter(DELIVERED_SMS_ACTION)); 

在基本完成了要做的工作,接下来要做的就是将sendTextMessage的第4个和第5个参数改为sentPI、deliverPI,这样工作基本完成,修改后的sendSMS方法如下:

  
  1. private void sendSMS(String phoneNumber, String message) {  
  2.     // ---sends an SMS message to another device---  
  3.     SmsManager sms = SmsManager.getDefault();  
  4.     String SENT_SMS_ACTION = "SENT_SMS_ACTION";  
  5.     String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";  
  6.  
  7.     // create the sentIntent parameter  
  8.     Intent sentIntent = new Intent(SENT_SMS_ACTION);  
  9.     PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentIntent,  
  10.             0);  
  11.  
  12.     // create the deilverIntent parameter  
  13.     Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);  
  14.     PendingIntent deliverPI = PendingIntent.getBroadcast(this, 0,  
  15.             deliverIntent, 0);  
  16.  
  17.     // register the Broadcast Receivers  
  18.     registerReceiver(new BroadcastReceiver() {  
  19.         @Override 
  20.         public void onReceive(Context _context, Intent _intent) {  
  21.             switch (getResultCode()) {  
  22.             case Activity.RESULT_OK:  
  23.                 Toast.makeText(getBaseContext(),  
  24.                         "SMS sent success actions", Toast.LENGTH_SHORT)  
  25.                         .show();  
  26.                 break;  
  27.             case SmsManager.RESULT_ERROR_GENERIC_FAILURE:  
  28.                 Toast.makeText(getBaseContext(),  
  29.                         "SMS generic failure actions", Toast.LENGTH_SHORT)  
  30.                         .show();  
  31.                 break;  
  32.             case SmsManager.RESULT_ERROR_RADIO_OFF:  
  33.                 Toast  
  34.                         .makeText(getBaseContext(),  
  35.                                 "SMS radio off failure actions",  
  36.                                 Toast.LENGTH_SHORT).show();  
  37.                 break;  
  38.             case SmsManager.RESULT_ERROR_NULL_PDU:  
  39.                 Toast.makeText(getBaseContext(),  
  40.                         "SMS null PDU failure actions", Toast.LENGTH_SHORT)  
  41.                         .show();  
  42.                 break;  
  43.             }  
  44.         }  
  45.     }, new IntentFilter(SENT_SMS_ACTION));  
  46.     registerReceiver(new BroadcastReceiver() {  
  47.         @Override 
  48.         public void onReceive(Context _context, Intent _intent) {  
  49.             Toast.makeText(getBaseContext(), "SMS delivered actions",  
  50.                     Toast.LENGTH_SHORT).show();  
  51.         }  
  52.     }, new IntentFilter(DELIVERED_SMS_ACTION));  
  53.  
  54.     // if message's length more than 70 ,  
  55.     // then call divideMessage to dive message into several part ,and call  
  56.     // sendTextMessage()  
  57.     // else direct call sendTextMessage()  
  58.     if (message.length() > 70) {  
  59.         ArrayList<String> msgs = sms.divideMessage(message);  
  60.         for (String msg : msgs) {  
  61.             sms.sendTextMessage(phoneNumber, null, msg, sentPI, deliverPI);  
  62.         }  
  63.     } else {  
  64.         sms.sendTextMessage(phoneNumber, null, message, sentPI, deliverPI);  
  65.     }  
  66. } 

运行之后的,发送短信成功的话就可以看到如下界面:

Android 开发之旅:短信的收发及在android模拟器之间实践(一)

图5、增强SMS(一)

5、SMS增强(二)

下面这个增强是使SMS能够发送二进制数据。要发送数据要使用SmsManager类的sendDataMessage方法,跟sendTextMessage方法类似,只不过该方法多了一个目标端口的参数,构建该SMS的过程跟前面的类似这里就不在累述。

杰理 JL701N/JL703N USB MIDI 使用教程 摘要:本教程介绍如何在杰理JL701N/JL703N音箱的可视化SDK中配置USB MIDI功能。主要步骤包括:1)启用PC模式;2)修改SDK宏定义启用USB MIDI;3)实现MIDI数据接收处理逻辑;4)调用接口发送MIDI数据;5)使用MIDI-OX测试功能。针对低版本SDK可能出现的设备识别问题,提供了在midi.c文件中添加特定代码行的解决方案。使用前需确保SDK版本达标,并注意备份原始文件。 阅读详情

相关推荐

Python邮件自动化实战:基于imaplib和email库的高效邮件管理方案

本文详细介绍了如何使用Python的imaplib和email库实现高效邮件自动化管理。通过实战案例展示自动收取、解析邮件、下载附件等核心功能,帮助开发者快速构建企业级邮件处理系统,大幅提升工作效率。特别适合需要处理大量邮件的金融、数据分析等场景。

weixin_30500105的博客 618

Android 开发之旅:短信的收发及在android模拟器之间实践(二)

引言 前面我们介绍都只是如何发送SMS消息,接下来我们介绍如何接收SMS消息,及另一种发短信的方式并增强为可以发生图片等,最后介绍一下emulator工具。本文的主要内容如下: 1~5见Android 开发之旅:短信的收发及在android模拟器之间实践(一) 6、温故知新之Intent 7、准备工作:SmsMessage类 8、SMS接收程序 9、另一种发送短信的...

weixin_34260991的博客 289

COD论文笔记VSCode: General Visual Salient and Camouflaged Object Detection with 2D Prompt Learning

VSCode模型通过引入领域特定提示和任务特定提示,结合提示区分损失,成功地在单一模型中处理多个显著目标检测和伪装目标检测任务。这种方法不仅提高了模型的性能,还展示了其对未见任务的泛化能力。作者使用 Visual saliency transformer ICCV 2021 作为baseline model这张图展示了VSCode模型的整体框架,特别强调了2D提示学习方法。

985小菜鸡 1627

Android:发送短信到模拟器(emulator)

1.开启telnet功能  windows》控制面板》程序》打开或关闭windows功能》勾选telnet客户端》确定 2.telnet localhost 5554 其中5554为模拟器控制台端口号 3.连接成功以后,输入help查看支持的命令 help Android console command help: help|h|? print a list

混迹于移动互联网和手机行业 1411

windows11 远程桌面连接 通过代理连接RDP桌面报错 错误代码0x904 拓展错误代码0x7

打开windows Defender防火墙设置--允许应用通过防火墙更改设置--允许其他应用浏览--进入C:\WINDOWS\system32目录选择mstsc.exe进入C:\Windows\SysWOW64目录h'qmstsc.exe添加后列表里多了一个远程桌面连接,还有一个Remote Desktop Connection,配置网络权限后保存连接成功。

weixin_43978891的博客 1万+

ERA5数据批量下载

ERA5再分析数据的IDM接管下载

qq_38734327的博客 3034

手机模拟器相关的一些操作

前言 模拟器启动之后,会打开一个网络套接字(Socket)端口与其所在的主机进行通信,我们可以借助一些工具,通过这个端口与模拟器进行交互,比如:Telnet。 以windows系统为例,进入到“控制面板”后,单击“程序和功能”,然后单击“打开或关闭Windows功能”,在弹出的对话框中确保“Telnet客户端”已被勾选。 在控制命令台输入Telnet进入Telnet客户端,输入“telnet ...

zytthappy的博客 2337

双RTX 3090实战:如何用vLLM低成本部署Qwen2.5-14B大模型(附避坑清单)

本文详细介绍了如何利用双RTX 3090显卡低成本部署Qwen2.5-14B大模型的完整指南,包括硬件选型、环境配置、vLLM优化及生产环境调优。重点解析了BF16混合精度在显存占用与推理质量上的平衡策略,并提供了实用的避坑清单和性能调优技巧,帮助开发者高效实现大模型部署。

pz890123456的博客 699

短信的收发及在android模拟器之间实践(二)

前面我们介绍都只是如何发送SMS消息,接下来我们介绍如何接收SMS消息,及另一种发短信的方式并增强为可以发生图片等,最后介绍一下emulator工具。本文的主要内容如下: 1~5见Android 开发之旅:短信的收发及在android模拟器之间实践(一)6、温故知新之Intent7、准备工作:SmsMessage类8、SMS接收程序9、另一种发送短信的方式:使用Intent10、增强SMS为

chong7171的专栏 1855

基于逆向工程的中国裁判文书网爬虫技术深度解析

本文详细介绍了中国裁判文书网爬虫的开发过程,涵盖了从基础爬取到高级功能的完整解决方案。逆向工程分析:理解网站的反爬机制和加密逻辑浏览器自动化:使用Playwright模拟真实用户行为参数加密:通过JavaScript执行环境生成加密参数智能调度:控制请求频率,避免被检测错误处理:完善的异常处理和重试机制。

2201_76125261的博客 2145

8.19华为OD机试真题 新系统 - 基站低能耗时段统计 (Java/Py/C/C++/Js/Go)

8.19华为OD机试真题 新系统 - 基站低能耗时段统计 (Java/Py/C/C++/Js/Go)

算法大师! 1149

Android 开发之短信的收发及在android模拟器之间实践(一)

引言 本文通过运行两个Android模拟器,介绍在Android中如何实现短信服务(SMS,short message service)的功能。通过这个例子,我想带给大家的是:更加熟悉之前介绍过的Android应用程序的概念及技术细节,且通过实例调度大家的兴趣。我之所以选择SMS为例子,主要原因是SMS已经非常成熟了,从中可以发掘更多的信息和技术细节,而且我相信大部分人发短信比打电话多。 本文...

(Never Give Up)--(我的知识点滴) 202

自抗扰控制(ADRC)理论与工程实践:8.2 模糊ADRC、神经网络ADRC等智能融合变体

智能融合ADRC变体概述 自抗扰控制(ADRC)与智能控制方法(如模糊逻辑、神经网络)的融合,旨在突破传统ADRC在非线性、时变系统中的应用局限。智能融合ADRC主要通过以下方式实现性能提升: 模糊ADRC 参数自整定:利用模糊推理在线调节ADRC带宽参数,实现自适应控制。 非线性反馈:用模糊控制器替代线性PD,灵活设计非线性控制策略。 优势:融入专家经验,无需精确模型;局限:依赖规则库设计,稳定性分析困难。 神经网络ADRC 增强ESO:用神经网络学习扰动动态,提高估计精度。

技术工作者 228

短信的收发及在android模拟器之间实践

短信的收发及在android模拟器之间实践 2011年12月28日   [b][/b]   本文通过运行两个Android模拟器,介绍在Android中如何实现短信服务(SMS,short message service)的功能。通过这个例子,我想带给大家的是:更加熟悉之前介绍过的Android应用程序的概念及技术细节,且通过实例调度大家的兴趣。我 之所以选择SMS为例子,主要原因是S...

flf592ap 222

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: Android 开发之旅:深入分析布局文件&又是“Hello World!”
下一篇: Android 开发之旅:短信的收发及在android模拟器之间实践(二)
xing...
博客等级 码龄17年 30粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值