快过年了,自己写了个android批量发送短信,短信前面添加人名,用来节日发短信,这样别人就不知道我是批量发送的了哈哈哈,当然写的很菜,刚开始玩这个敬请指教

 短信发送后去短信列表查看         


首先AndroidManifest.xml配置

软件的权限和需要用到达Activity类

    <uses-sdkandroid:minSdkVersion="22"android:targetSdkVersion="22" /><uses-permission android:name="android.permission.READ_SMS"/><uses-permission android:name="android.permission.READ_CONTACTS"/><uses-permission android:name="android.permission.WRITE_CONTACTS"/><uses-permission android:name="android.permission.RECEIVE_SMS"/><uses-permission android:name="android.permission.SEND_SMS" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="sendmsg.MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><receiver android:name="receiver.SMSReceiver"></receiver><activity android:name="sendmsg.ContactListActivity"></activity><activity android:name="sendmsg.SendMsgActivity"></activity></application>

创建联系人模型需要用的联系人的字段

package model;public class ContactBean {private int contactId;private String desplayName;private String phoneNum;private String sortKey;private Long phoneId;private String LookUpKey;private int selected = 0;private  String formattedNumber;private String pinyin;public int getContactId() {return contactId;}public void setContactId(int contactId) {this.contactId = contactId;}public String getDesplayName() {return desplayName;}public void setDesplayName(String desplayName) {this.desplayName = desplayName;}public String getPhoneNum() {return phoneNum;}public void setPhoneNum(String phoneNum) {this.phoneNum = phoneNum;}public String getSortKey() {return sortKey;}public void setSortKey(String sortKey) {this.sortKey = sortKey;}public Long getPhoneId() {return phoneId;}public void setPhoneId(Long phoneId) {this.phoneId = phoneId;}public String getLookUpKey() {return LookUpKey;}public void setLookUpKey(String lookUpKey) {LookUpKey = lookUpKey;}public int getSelected() {return selected;}public void setSelected(int selected) {this.selected = selected;}public String getFormattedNumber() {return formattedNumber;}public void setFormattedNumber(String formattedNumber) {this.formattedNumber = formattedNumber;}public String getPinyin() {return pinyin;}public void setPinyin(String pinyin) {this.pinyin = pinyin;}
}

联系人listview界面,全选于取消,List<ContactBean> list,存储联系人信息,

单list不为空时传递给下一个Activity,  intentSendMsg.putExtra("user", userList.toString()); 只接收字符串

public class ContactListActivity extends Activity {private ContactListAdapter adapter;private ListView contactList;private List<ContactBean> list;private AsyncQueryHandler asyncQueryHandler;private Boolean cancel = true;private Map<Integer, ContactBean> contactIdMap = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.contact_list_view);contactList =  (ListView) findViewById(R.id.contact_list);final Button selectAll = (Button) findViewById(R.id.select_all);Button sureBtn = (Button) findViewById(R.id.select_sure);asyncQueryHandler = new MyAsyncQueryHandler(getContentResolver());init();final Intent intentSendMsg = new Intent(this, SendMsgActivity.class);selectAll.setOnClickListener(new OnClickListener() {public void onClick(View v) {int len = list.size();if (Boolean.valueOf(cancel)) { //全选cancel = false;                    selectAll.setText("取消");for (int i = 0; i < len; i++) {ContactListAdapter.getIsSelected().put(i, true);}} else {    // 取消cancel = true;selectAll.setText("全选");for (int i = 0; i < len; i++) {ContactListAdapter.getIsSelected().put(i, false);}}adapter.notifyDataSetChanged();}});sureBtn.setOnClickListener(new OnClickListener() {private List<String> userList = new ArrayList<String>();@Overridepublic void onClick(View v) {Set<Entry<Integer, Boolean>> iterator = ContactListAdapter.getIsSelected().entrySet();for (Entry<Integer, Boolean> entry : iterator) {if (entry.getValue()) {int key = entry.getKey();ContactBean conBean = list.get(key);userList.add(conBean.getDesplayName()+":"+conBean.getPhoneNum());}}if (!userList.isEmpty()) {intentSendMsg.putExtra("user", userList.toString());startActivity(intentSendMsg);userList.clear();}}});}private void init() {Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;String[] projection = {ContactsContract.CommonDataKinds.Phone._ID,ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.DATA1, "sort_key",ContactsContract.CommonDataKinds.Phone.CONTACT_ID,ContactsContract.CommonDataKinds.Phone.PHOTO_ID,ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY};asyncQueryHandler.startQuery(0, null, uri, projection, null, null, "sort_key COLLATE LOCALIZED asc");}private class MyAsyncQueryHandler extends AsyncQueryHandler {public MyAsyncQueryHandler(ContentResolver cr) {super(cr);}@Overrideprotected void onQueryComplete(int token, Object cookie, Cursor cursor) {if (cursor != null && cursor.getCount() > 0) {contactIdMap = new HashMap<Integer, ContactBean>();list = new ArrayList<ContactBean>();cursor.moveToFirst();int count = cursor.getCount();for (int i = 0; i < count; i++) {cursor.moveToPosition(i);String name = cursor.getString(1);String number = cursor.getString(2);String sortKey = cursor.getString(3);int contactId = cursor.getInt(4);Long photoId = cursor.getLong(5);String lookUpKey = cursor.getString(6);if (!contactIdMap.containsKey(contactId)) {ContactBean contact = new ContactBean();contact.setDesplayName(name);contact.setPhoneNum(number);contact.setSortKey(sortKey);contact.setPhoneId(photoId);contact.setLookUpKey(lookUpKey);list.add(contact);contactIdMap.put(contactId, contact);}}if(list.size() > 0) {setAdapter(list);}}super.onQueryComplete(token, cookie, cursor);}}private void setAdapter(List<ContactBean> list) {adapter = new ContactListAdapter(this, list);//listview contactList 设置适配器contactList.setAdapter(adapter);}}

listview 的适配器, item数据 通过 getIsSelected 向下一个Activity传递数据

public class ContactListAdapter extends BaseAdapter {private LayoutInflater inflater;private List<ContactBean> list;private HashMap<String, Integer> alphaIndexer;private String[] sections;private Context ctx;private static HashMap<Integer, Boolean> isSelected;@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {//找到item布局文件//listview 里 inflate 第二个参数 可以写成null 或者 第三个参数 falseconvertView = inflater.inflate(R.layout.contact_list_item, parent, false);holder = new ViewHolder();holder.alpha = (TextView) convertView.findViewById(R.id.alpha);holder.name = (TextView) convertView.findViewById(R.id.name);holder.number = (TextView) convertView.findViewById(R.id.number);holder.cb = (CheckBox) convertView.findViewById(R.id.checkUser);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}ContactBean contact = list.get(position);String name = contact.getDesplayName();String number = contact.getPhoneNum();holder.name.setText(name);holder.number.setText(number);String currentStr = getAlpha(contact.getSortKey());String previewStr = (position - 1) >= 0 ? getAlpha(list.get(position - 1).getSortKey()) : "";if (!previewStr.equals(currentStr)) {holder.alpha.setVisibility(View.VISIBLE);holder.alpha.setText(currentStr);} else {holder.alpha.setVisibility(View.GONE);}final int pst = position;holder.cb.setChecked(getIsSelected().get(position));//单个联系人选择 holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {getIsSelected().put(pst, isChecked);}});return convertView;}public ContactListAdapter(Context context, List<ContactBean> list) {this.ctx = context;this.inflater = LayoutInflater.from(context); //创建视图  设置上下文this.list = list;this.alphaIndexer = new HashMap<String, Integer>();isSelected = new HashMap<Integer, Boolean>();for (int i = 0; i < list.size(); i++) {String name = getAlpha(list.get(i).getSortKey());if (!alphaIndexer.containsKey(name)) {alphaIndexer.put(name, i);}getIsSelected().put(i, false);}Set<String> sectionLetters = alphaIndexer.keySet();ArrayList<String> sectionList = new ArrayList<String>(sectionLetters);Collections.sort(sectionList);sections = new String[sectionList.size()];sectionList.toArray(sections);}//listview item 需要展示的数据private static class ViewHolder {TextView alpha;TextView name;TextView number;CheckBox cb;}// 字母private String getAlpha(String str) {if (str == null) {return "#";}if (str.trim().length() == 0) {return "#";}char c = str.trim().substring(0, 1).charAt(0);Pattern pattern = Pattern.compile("^[A-Za-z]+$");if (pattern.matcher(c + "").matches()) {return (c + "").toUpperCase();} else {return "#";}}public static HashMap<Integer, Boolean> getIsSelected() {return isSelected;}public static void setIsSelected(HashMap<Integer, Boolean> isSelected) {ContactListAdapter.isSelected = isSelected;}}

短信发送界面

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"><ListView android:id="@+id/usermsg_list"android:layout_width="wrap_content"android:layout_height="170dip"android:cacheColorHint="#000000"android:divider="#887d7d"android:dividerHeight="4dip"android:fadingEdge="none"android:scrollbars="vertical"android:scrollingCache="false"android:visibility="visible"/><ScrollView android:id="@+id/sv"android:layout_width="match_parent"android:layout_height="149dip"android:layout_below="@id/usermsg_list"android:background="@drawable/stbottom"android:paddingTop="4dip"android:orientation="vertical" ><LinearLayout android:id="@+id/sms_linear"android:layout_height="wrap_content"android:layout_width="match_parent"android:orientation="vertical"/></ScrollView><LinearLayout android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_alignParentBottom="true"android:background="#ffffff"><EditText android:id="@+id/edit"android:layout_width="match_parent"android:layout_height="150dip"android:layout_marginTop="1dip"android:layout_marginBottom="1dip"android:padding="5dip"android:gravity="top"android:background="@drawable/phone_border"/><Button android:id="@+id/send_btn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="发送"android:background="@drawable/sendbtn"android:textColor="#ffffff"/></LinearLayout></RelativeLayout>

短信发送界面listview中 item 用户名和电话 删除按钮

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal" ><TextView android:id="@+id/usermsg"android:layout_height="24dip"android:layout_width="wrap_content"android:layout_marginTop="4dip"android:layout_marginBottom="4dip"android:textSize="10pt"/><Button android:id="@+id/user_del"android:layout_width="26dip"android:layout_height="26dip"android:background="@drawable/del"android:textColor="#d88822"android:textSize="6pt"android:gravity="center"android:text="X"/>
</LinearLayout>

main.xml里 注册的广播接 短信发送的状态

<receiver android:name="receiver.SMSReceiver"></receiver>
public class SMSReceiver extends BroadcastReceiver{public List<String> name = new ArrayList<String>();private int id = 0;private ScrollView sv;private Context ctx;private LinearLayout stateList;private Handler mHandler = new Handler();public SMSReceiver(ScrollView sv, Context ctx) {this.sv = sv;this.ctx = ctx;}public int getId() {return id;}public void setId(int id) {this.id = id;}public List<String> getName() {return this.name;}public void setName(String name) {this.name.add(name);}private void setTextView(LinearLayout list) {int id = getId();// ScrollView item 设置LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);params.setMargins(0, 0, 10, 10);params.gravity = Gravity.END;TextView text = new TextView(ctx);text.setText("成功发送给:" + getName().get(id));setId(id + 1);text.setBackgroundResource(R.drawable.msg_bg);text.setPadding(5, 5, 100, 5);text.setSingleLine(false);text.setLayoutParams(params);// 添加到了LinearLayout里list.addView(text);mHandler.post(new Runnable() {@Overridepublic void run() {// ScrollView 短信发送成功后向下滚动sv.fullScroll(ScrollView.FOCUS_DOWN);}});}@Overridepublic void onReceive(Context ctx, Intent intent) {if (stateList == null) {stateList = (LinearLayout) sv.findViewById(R.id.sms_linear);}if (intent.getAction().equals("SMS_SEND_ACTIOIN")) {switch (getResultCode()) {//发送成功case Activity.RESULT_OK:setTextView(stateList);break;default:break;}}}}

短信发送

public class SendSMS {private static String SMS_SEND_ACTIOIN  = "SMS_SEND_ACTIOIN";private SMSReceiver SendSMSReceiver;private Context ctx;private ScrollView sv;private String SMSShort;public SendSMS(Context ctx, ScrollView sv) {this.ctx = ctx;this.sv = sv;registerReceiver();}public String getSMSShort() {return SMSShort;}public void setSMSShort(String sMSShort) {SMSShort = sMSShort;}//注册public void registerReceiver() {IntentFilter filter = new IntentFilter(SMS_SEND_ACTIOIN);SendSMSReceiver = new SMSReceiver(sv, ctx);ctx.registerReceiver(SendSMSReceiver, filter);}//取消注册public void unRegisterReceiver() {if (SendSMSReceiver != null) {ctx.unregisterReceiver(SendSMSReceiver);}}public int sendSMS(String sms, List<SendItemBean> list) {int size = 0;SmsManager smsManager = SmsManager.getDefault();Iterator<SendItemBean> it = list.iterator();Intent sendIT = new Intent(SMS_SEND_ACTIOIN);//注册广播PendingIntent sendPI = PendingIntent.getBroadcast(ctx, 0, sendIT, 0);//遍历电话号码while (it.hasNext()) {SendItemBean item = it.next();String[] user = item.getUserMsg().split(":");String name = user[0];String strSms = name + sms;SendSMSReceiver.setName(strSms);//短信发送smsManager.sendTextMessage(user[1], null, strSms, sendPI, null);size = item.getId() + 1;}return size;}}

发送短信Activity界面

public class SendMsgActivity extends Activity{private static final int OVER_SUCCESS = 0;private static final int OVER_FAILUER = 1;private SendMsgAdapter adapter;private List<SendItemBean> list;private ListView userMsgList;private SendSMS sendSMS;private Thread mThread;private Button sendBtn;private EditText ed;private String SMS;//Handler ui更新, 只能在子线程中private Handler mHandler = new Handler(){public void handleMessage(Message msg) {//根据消息, 设置ui样式switch (msg.what) {case OVER_SUCCESS:sendBtn.setBackgroundColor(Color.parseColor("#f90000"));sendBtn.setText("发送");sendBtn.setClickable(true);mHandler.removeCallbacks(runnable);break;default:sendBtn.setBackgroundColor(Color.parseColor("#968e8e"));sendBtn.setText("短信批量发送中");sendBtn.setClickable(false);break;}}};Runnable runnable = new Runnable() {@Overridepublic void run() {mHandler.obtainMessage(OVER_FAILUER).sendToTarget();// 联系人数组 传递给短信发送的方法int size = sendSMS.sendSMS(SMS, list);try {Thread.sleep(2000);if (size == list.size()) {//发送短信状态 发送成功与否的 消息mHandler.obtainMessage(OVER_SUCCESS).sendToTarget();} } catch (Exception e) {mHandler.obtainMessage(OVER_FAILUER).sendToTarget();}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.send_msg);ed = (EditText) findViewById(R.id.edit);sendBtn = (Button) findViewById(R.id.send_btn);userMsgList = (ListView) findViewById(R.id.usermsg_list);ScrollView scrollView = (ScrollView) findViewById(R.id.sv);Intent intent = getIntent();CharSequence userStr = intent.getStringExtra("user");sendSMS = new SendSMS(this, scrollView);list = new ArrayList<SendItemBean>();// 联系人数组String[] userAry = userStr.toString().replaceAll("\\[|\\]", " ").split(",");int len = userAry.length;for (int i = 0; i < len; i++) {SendItemBean sendItemBean = new SendItemBean();sendItemBean.setId(i);sendItemBean.setUserMsg(userAry[i]);list.add(sendItemBean);  }setAdapeter(list);sendBtnClick();}//确定发送public void sendBtnClick() {sendBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {SMS = ed.getText().toString().trim();if (SMS.isEmpty()) {Toast.makeText(SendMsgActivity.this, "短信不能为空", Toast.LENGTH_SHORT).show();} else {mThread = new Thread(runnable);mThread.start();}}});}private void setAdapeter(List<SendItemBean> list) {adapter = new SendMsgAdapter(this, list);//listview 适配器userMsgList.setAdapter(adapter);}@Overrideprotected void onPause() {super.onPause();//注册的广播销毁 退出当前activity时sendSMS.unRegisterReceiver();list.clear();adapter.notifyDataSetChanged();}
}

短信发送界面  联系人listview

public class SendMsgAdapter extends BaseAdapter {private List<SendItemBean> list;private LayoutInflater inflater;private Context ctx;private static String[] userItem;@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}public void removeItem(int position) {list.remove(position);//联系人单个删除 后 为空是 退出当前Activityif (list.size() == 0) {/*Intent intent = new Intent();intent.setClass(ctx, ContactListActivity.class);ctx.startActivity(intent);*/((Activity) ctx).finish();}this.notifyDataSetChanged();}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (holder == null) {convertView = inflater.inflate(R.layout.send_msg_item, null);holder = new ViewHolder();holder.userMsg = (TextView) convertView.findViewById(R.id.usermsg);holder.del = (Button) convertView.findViewById(R.id.user_del);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}SendItemBean sendItemBean = list.get(position);String userMsg = sendItemBean.getUserMsg();holder.userMsg.setText(userMsg);final int pst = position;//联系人单个删除holder.del.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {removeItem(pst);}});return convertView;}public SendMsgAdapter(Context context, List<SendItemBean> list) {this.ctx = context;this.inflater = LayoutInflater.from(context);this.list = list;}private static class ViewHolder {TextView userMsg;Button del;}public static String[] getUserItem() {return userItem;}public static void setUserItem(String[] userItem) {SendMsgAdapter.userItem = userItem;}}

菜鸟一个,额,大致如上了, 有不对的 地方敬请指教,求调教哦!

android批量发送短信相关推荐

  1. Android - 批量发送短信的实现方式

    做了一个简单的批量发短信小工具.功能:从 sdcard 中读取发送短信的手机列表,每行一个手机号(存在/sdcard/ADAGroupSMS/PhoneNum.txt),批量发送短信.适用于广告推广. ...

  2. Android通过for循环批量发送短信

    由于需要,要用手机给其他某个手机批量发送短信,于是想到了写一android应用来实现这一需要. 其中,主要代码如下(通过for循环发送短信) public class SendManyMessage ...

  3. android将发送短信写入发件箱

    最近写了一个应用批量发送短信,但是在发件箱里却看不到发送的内容 于是找了一个方法将发送的短信写入发件箱: 代码如下,可供参考: try{ContentValues values = new Conte ...

  4. 4che3 scu发送超时设置_Redis实现订阅发布与批量发送短信

    1 什么是redis订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.直接点,你可以理解为我关注了你,你发布了信息,文章等,我就可以立 ...

  5. 个人永久性免费-Excel催化剂功能第85波-灵活便捷的批量发送短信功能(使用腾讯云接口)...

    微信时代的今天,短信一样不可缺席,大系统都有集成短信接口. 若只是临时用一下,若能够直接在Excel上加工好内容就可以直接发送,这些假设在此篇批量群发短信功能中都为大家带来完美答案. 业务场景 不多说 ...

  6. android 短信发件箱,android将发送短信写入发件箱

    最近写了一个应用批量发送短信,但是在发件箱里却看不到发送的内容 于是找了一个方法将发送的短信写入发件箱: 代码如下,可供参考: try{ ContentValues values = new Cont ...

  7. JAVA 实现阿里云短信申请模板以及批量发送短信

    添加pom.xml依赖 <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java ...

  8. 快捷指令批量发送短信

    1.通过iphone快捷指令,使用json文本批量发送短信 2.实现方式如下 访问list里面name的方式如下: 通过object.index.key访问数组list里面的name,phone值.然 ...

  9. php redis消息订阅与发布_PHP使用Redis实现订阅发布与批量发送短信

    原标题:PHP使用Redis实现订阅发布与批量发送短信 1 什么是redis订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.直接点, ...

  10. 【h5移动端页面调起手机sms批量发送短信,兼容ios和android】

    移动端h5页面调起手机发送短信功能,实现批量发送生日祝福模板,苹果和安卓的兼容写法不一样. 先判断是ios还是android,拼接的写法不一样 android是sms:188XXXXXXXX,134X ...

最新文章

  1. 【mysql】启动mysql 服务器 Redirecting to /bin/systemctl start mysql.service
  2. linux卸载已安装的java_Linux 中如何卸载已安装的软件(转载)
  3. 非常有趣的Console
  4. 初识WINCE的HIVE注册表
  5. mysql查询没有权限试图_MySQL迁移后提示查询view权限不足的处理
  6. php导入跟引入的区别,PHP7 引入的“??” 和“?:”的区别
  7. hdu 4775 Infinite Go(暴力)
  8. django admin 登陆快速添加验证码功能
  9. 利用Windows server 2003 实现DHCP中继
  10. linux 小度wifi,树莓派2小度wifi(MT7601U)驱动
  11. docker装LibreELEC_瞎弄 篇一:J3455NUC虚拟机安装LibreELEC核显直通HDMI输出
  12. LM393(寻迹原理)
  13. linux 文件 内容 并集,Linux 两个文件求交集、并集、差集
  14. 【全面恢复受损的Word文档】
  15. 百度网盘微信小程序文件 同步到百度网盘APP或客户端
  16. 解决百度地图(new BMap.Autocomplete)影响input赋值的问题
  17. 使用Aeon Timeline 2 for mac如何恢复丢失的文件
  18. Apache-apollo服务器搭建
  19. python安装出现modify_pycharm之运行时出现Edit configuration及老是弹出Modify Setup(转载,亲测有效)...
  20. python point

热门文章

  1. 淘宝用户行为分析——通过excel分析
  2. 论文:Slicing Aided Hyper Inference and Fine-tuning for Small Object Detection通过划块的方式进行小目标检测
  3. IT学习网站,各大主流网站
  4. python合并大量ts文件_python爬取基于m3u8协议的ts文件并合并
  5. RLC电阻电容电感基础知识——电阻篇
  6. 将STM32 Flash的一部分虚拟为大容量存储设备 USB_Device
  7. 【论文阅读】中医类药性分析:使用机器学习方法预测类药性
  8. JAVA基础算法(6)----- 国际象棋 α 皇后问题
  9. fast无线路由器设置服务器,迅捷(FAST)FW300R无线路由器怎么设置
  10. ArcGIS:矢量、栅格文件裁剪(批量处理)