android开发学习---开发一个简易的短信发送器
一.需求:
开发一个简易的短信发送器,输入:对方手机号码,短信内容,点击发送按钮,短信发送成功,对方手机成功收到短信.
其中要求短信内容过长时可以自动拆分,长度英文是160个英文,中文是70个,中英混合时以70个为准.
当手机号码和短信内容为空时要有提示.
二.实现:
1.实现的效果图
1)5554的模拟器给5558的模拟器发送短信
2)当短信内容过长时,自动实现拆分
2.实现的步骤
1).建立新的工程
2).实现代码
实现的页面布局,/sms/res/layout/activity_main.xml,这里要特别注意定义的onClick方法send_sms
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/input_phone" /> <TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/et_phone"
android:layout_below="@+id/et_phone"
android:text="@string/input_sms" /> <EditText
android:id="@+id/et_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView2"
android:layout_alignRight="@+id/et_phone"
android:layout_below="@+id/textView2"
android:lines="4"
android:ems="10" /> <Button
android:id="@+id/bt_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/et_content"
android:layout_below="@+id/et_content"
android:text="@string/send"
android:onClick="send_sms"/> <EditText
android:id="@+id/et_phone"
android:layout_width="wrap_content"
android:inputType="phone"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textView1"
android:ems="10" /> </RelativeLayout>
变量配置:/sms/res/values/strings.xml,每次定义新的变量时,保存时gen目录下的R.java都会自动生成对其值的引用
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">短信发送器</string>
<string name="action_settings">Settings</string>
<string name="input_phone">请输入手机号</string>
<string name="input_sms">请输入短信内容</string>
<string name="send">发送</string>
<string name="error_message">对方手机号码和短信内容都是必填的!</string>
</resources>
/sms/AndroidManifest.xml 这里涉及到用户权限问题和sdk最低版本的支持问题.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.amos.sms"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="4"
android:targetSdkVersion="4" />
<uses-permission android:name="android.permission.SEND_SMS"/> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.amos.sms.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>
</application> </manifest>
MainActivity.java实现短信发送核心代码就在这里,当手机和短信其中有一个为空时提示信息是由Toast类实现的.
SMSManager类实现了短信的发送和短信的拆分.所示综合来看,都是在调用google开发的API.
package com.amos.sms; import android.app.Activity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity {
private EditText et_phone;// 文本输入框中的手机号码
private EditText et_content;// 文本输入框中的短信内容
private String tag = "MainActivity"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_phone = (EditText) this.findViewById(R.id.et_phone);
et_content = (EditText) this.findViewById(R.id.et_content); } public void send_sms(View v) {
String phone = et_phone.getText().toString();
String content = et_content.getText().toString();
if ("".equals(phone) || "".equals(content)) {
Log.e(tag, "手机号或者短信内容为空!" + " phone:" + phone + " content:" + content);
// 提示用户输入手机号码和短信内容
Toast.makeText(this, R.string.error_message, Toast.LENGTH_LONG).show();
return;
} else {
System.out.println("phone:" + phone + " content:" + content);
SmsManager smsManger = SmsManager.getDefault();
// sentIntent, deliveryIntent
// 延期的意图,这里sentIntent是发送报告,运营商返回的信息短信的发送报告等;deliveryIntent表示短信的返回报告
Log.w(tag, "点击发送按钮了");
// smsManger.sendTextMessage(phone, null, content, null, null);
for (String message : smsManger.divideMessage(content)) {
smsManger.sendTextMessage(phone, null, message, null, null);
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
3.实现过程中遇到的问题及解决方法
1).程序编译出现了问题,运行不了,报了下面的提示信息:
[2014-02-26 22:33:14 - Dex Loader] Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
[2014-02-26 22:33:14 - sms] Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
遇到上面的问题,在网上搜索了好一会才找到答案,是编译器的版本控制问题,将项目的支持的最低sdkversion降低到低于所使用的模拟器即可.如下所示:
<uses-sdk
android:minSdkVersion="4"
android:targetSdkVersion="4" />
2).permission权限问题
02-27 00:43:43.533: E/AndroidRuntime(381): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-27 00:43:43.533: E/AndroidRuntime(381): at dalvik.system.NativeStart.main(Native Method)
02-27 00:43:43.533: E/AndroidRuntime(381): Caused by: java.lang.reflect.InvocationTargetException
02-27 00:43:43.533: E/AndroidRuntime(381): at com.amos.sms.MainActivity.send_sms(MainActivity.java:39)
02-27 00:43:43.533: E/AndroidRuntime(381): at java.lang.reflect.Method.invokeNative(Native Method)
02-27 00:43:43.533: E/AndroidRuntime(381): at java.lang.reflect.Method.invoke(Method.java:521)
02-27 00:43:43.533: E/AndroidRuntime(381): at android.view.View$1.onClick(View.java:2067)
02-27 00:43:43.533: E/AndroidRuntime(381): ... 11 more
02-27 00:43:43.533: E/AndroidRuntime(381): Caused by: java.lang.SecurityException: Sending SMS message: User 10038 does not have android.permission.SEND_SMS.
02-27 00:43:43.533: E/AndroidRuntime(381): at android.os.Parcel.readException(Parcel.java:1247)
02-27 00:43:43.533: E/AndroidRuntime(381): at android.os.Parcel.readException(Parcel.java:1235)
02-27 00:43:43.533: E/AndroidRuntime(381): at com.android.internal.telephony.ISms$Stub$Proxy.sendText(ISms.java:369)
02-27 00:43:43.533: E/AndroidRuntime(381): at android.telephony.SmsManager.sendTextMessage(SmsManager.java:87)
02-27 00:43:43.533: E/AndroidRuntime(381): ... 15 more
这个权限问题是因为本项目涉及到用户安全以及隐私问题,短信的发送,所以需要赋一个权限给项目.
这里在AndroidManifest.xml中Permissions-->add --->User Permission ---> android.permission.SEND_SMS -->save即可.
3).linux下找不到AVD Manager
在eclipse中的window→Customize Perspective→Command Groups availability→Available command groups→勾選Android SDK and AVD Manager
4).如何下载sdk源码 (sdk api source code)
http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/
通过上面链接可以直接下载sdk各版本的源码jar文件.
4.本文源码
https://github.com/amosli/android.git 分支为sms
android开发学习---开发一个简易的短信发送器的更多相关文章
- Android_简易的短信发送器
这个随笔将介绍如何完成一个简单的第三方的短信发送器(不打开短信界面,调用android的api完成功能) 1.首先,我们来做布局 由于我这里写的是一个简易的,,短信发送,所以只是一个LinearLay ...
- android开发学习:打电话和发短信
1.新建一个android项目 File--New--Other--android application project 填写application name(就是应用的名字.比方:天天酷跑) 填写 ...
- Android学习4—短信发送器的实现
界面预览: 由图中可以看出,此APP需要的组件有:两个TextView,一个用于显示手机号码的标题,另一个用于显示短信内容的标题. ...
- IOS 开发,调用打电话,发短信,打开网址
IOS 开发,调用打电话,发短信,打开网址 1.调用 自带mail [[UIApplication sharedApplication] openURL:[NSURL URLWithString: ...
- Android Studio精彩案例(五)《JSMS短信验证码功能实现》
转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 很多应用刚打开的时候,让我们输入手机号,通过短信验证码来登录该应用.那么,这个场景是怎么实现的呢?其实是很多开放平台提供了短信验证功能 ...
- 无废话Android之常见adb指令、电话拨号器、点击事件的4种写法、短信发送器、Android 中各种布局(1)
1.Android是什么 手机设备的软件栈,包括一个完整的操作系统.中间件.关键的应用程序,底层是linux内核,安全管理.内存管理.进程管理.电源管理.硬件驱动 2.Dalvik VM 和 JVM ...
- Android实战--短信发送器
首先设计界面 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...
- Android项目——短信发送器
因为应用要使用手机的短信服务,所以要在清单文件AndroidManifest.xml中添加短信服务权限: <?xml version="1.0" encoding=" ...
- android短信发送器源代码
Activity类: import java.util.List;import android.app.Activity;import android.app.PendingIntent;import ...
随机推荐
- 【Scala】Scala-调用Java-集合
Scala-调用Java-集合 sacla 遍历 java list_百度搜索 13.11 Scala混用Java的集合类调用scala的foreach遍历问题 - 简书
- Ubuntu mysql开启远程登录的方法
一.问题 Ubuntu 16.0.4 mysql5.7 二.解决问题 Ubuntu中MySQL的配置文件是在/etc/mysql/mysql.conf.d/mysqld.cnf,VI该文件把 b ...
- 【python】bytes与字符串的相互转化
代码: # bytes转字符串方式一 b=b'\xe9\x80\x86\xe7\x81\xab' string=str(b,'utf-8') print(string) # bytes转字符串方式二 ...
- Python 使用pymongo操作mongodb库
Python 使用pymongo操作mongodb库 2016-12-31 21:55 1115人阅读 评论(0) 收藏 举报 分类: - - - Python(10) 版权声明:本文为博主原创文 ...
- CentOS7安装Docker与使用篇
一.在CentOS7上安装Docker篇 1. 查看系统版本: $ cat /etc/redhat-release CentOS Linux release 7.0.1406 (Core) 2. 安装 ...
- 转-为什么Lisp语言如此先进?(译文)
之前在看黑客与画家的时候看过,今天重温,完全不一样的感觉! 原文地址:http://www.ruanyifeng.com/blog/2010/10/why_lisp_is_superior.html ...
- jQuery 1
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8& ...
- java动态代理_aop2
一.什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 代理模 ...
- emplace_back() 和 push_back 的区别(转)
在引入右值引用,转移构造函数,转移复制运算符之前,通常使用push_back()向容器中加入一个右值元素(临时对象)的时候,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放 ...
- 【Fanvas技术解密】HTML5 canvas实现脏区重绘
先说明一下,fanvas是笔者在企鹅公司开发的,即将开源的flash转canvas工具. 脏区重绘(dirty rectangle)并不是一门新鲜的技术了,这在最早2D游戏诞生的时候就已经存在. 复杂 ...