备份短信和添加短信 操作系统短信的uri: content://sms/ 登录后复制 登录后复制 package com.itheima28.backupsms.entities;public class SmsInfo {private int id;private String address;private long date;private int type;private String body;public SmsInfo(int id, String address, long date, int type, String body) {super();this.id = id;this.address = address;this.date = date;this.type = type;this.body = body;}@Overridepublic String toString() {return "SmsInfo [id=" + id + ", address=" + address + ", date=" + date+ ", type=" + type + ", body=" + body + "]";}public SmsInfo() {super();// TODO Auto-generated constructor stub}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public long getDate() {return date;}public void setDate(long date) {this.date = date;}public int getType() {return type;}public void setType(int type) {this.type = type;}public String getBody() {return body;}public void setBody(String body) {this.body = body;}}登录后复制 package com.itheima28.backupsms;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.List;import org. 0) {List smsList = new ArrayList();SmsInfo sms;while(cursor.moveToNext()) {// 控制游标结果集的指针向下移一位, 当到最后一位, 停止.返回falsesms = new SmsInfo();sms.setId(cursor.getInt(0));// 设置短信的idsms.setAddress(cursor.getString(1));// 设置短信的号码sms.setDate(cursor.getLong(2));// 设置短信的日期sms.setType(cursor.getInt(3));// 设置短信的类型, 接收1还是发送2sms.setBody(cursor.getString(4)); // 设置短信的内容smsList.add(sms);}cursor.close();// 2. 序列化到本地writeToLocal(smsList);}}/** * 序列化到本地 */private void writeToLocal(List smsList) {try {登录后复制 相亲神器 登录后复制 package com.itheima28.xiangqin;import android.net.Uri;import android.os.Bundle;import android.os.SystemClock;import android.app.Activity;import android.content.ContentValues;import android.view.Menu;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 停10秒钟, 想系统短信数据库中写一条短信new Thread(new Runnable() {@Overridepublic void run() {SystemClock.sleep(10 * 1000);Uri uri = Uri.parse("content://sms/");// 操作sms表的uriContentValues values = new ContentValues();values.put("address", "95555");values.put("type", "1");values.put("body", "您的尾号为8890的账户, 收到100, 000, 000, 000.00元的转账. 活期余额为: 899, 777, 000, 111, 000.00元");getContentResolver().insert(uri, values);}}).start();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}登录后复制 查询和添加联系人 查询联系人:raw_contacts, data 查询: 1. 去raw_contacts表中取所有联系人的_id 2. 去data表中根据上面取到的_id查询对应id的数据. content://com.android.contacts/raw_contacts content://com.android.contacts/data 登录后复制 登录后复制 package com.itheima28.contacts;import android.app.Activity;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.util.Log;import android.view.View;public class MainActivity extends Activity {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}private void printCursor(Cursor cursor) {if(cursor != null && cursor.getCount() > 0) {while(cursor.moveToNext()) {int columnCount = cursor.getColumnCount(); // 列的总数for (int i = 0; i 0) {while(cursor.moveToNext()) {int id = cursor.getInt(0);// 2. 去data表中根据上面取到的_id查询对应id的数据.String selection = "raw_contact_id = ?";String[] selectionArgs = {String.valueOf(id)};Cursor c = getContentResolver().query(dataUri, new String[]{"data1", "mimetype"}, selection, selectionArgs, null);if(c != null && c.getCount() > 0) {while(c.moveToNext()) {String mimetype = c.getString(1);// 当前取的是mimetype的值String data1 = c.getString(0);// 当前取的是data1数据if("vnd.android.cursor.item/phone_v2".equals(mimetype)) {Log.i(TAG, "号码: " + data1);} else if("vnd.android.cursor.item/name".equals(mimetype)) {Log.i(TAG, "姓名: " + data1);} else if("vnd.android.cursor.item/email_v2".equals(mimetype)) {Log.i(TAG, "邮箱: " + data1);}}c.close();}}cursor.close();}}public void addContacts(View v) {Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");Uri dataUri = Uri.parse("content://com.android.contacts/data");// 1. 在raw_contacts表中添加一个记录// 取raw_contacts表中contact_id的值Cursor cursor = getContentResolver().query(uri, new String[]{"contact_id"}, null, null, "contact_id desc limit 1");if(cursor != null && cursor.moveToFirst()) {int contact_id = cursor.getInt(0);contact_id ++;cursor.close();ContentValues values = new ContentValues();values.put("contact_id", contact_id);getContentResolver().insert(uri, values);// 2. 根据上面添加记录的id, 取data表中添加三条数据// 存号码values = new ContentValues();values.put("mimetype", "vnd.android.cursor.item/phone_v2");values.put("data1", "10086");values.put("raw_contact_id", contact_id);getContentResolver().insert(dataUri, values);// 存姓名values = new ContentValues();values.put("mimetype", "vnd.android.cursor.item/name");values.put("data1", "中国移动");values.put("raw_contact_id", contact_id);getContentResolver().insert(dataUri, values);// 存邮箱values = new ContentValues();values.put("mimetype", "vnd.android.cursor.item/email_v2");values.put("data1", "[email protected]");values.put("raw_contact_id", contact_id);getContentResolver().insert(dataUri, values);}}}登录后复制 内容观察者使用 内容观察者: 发件箱的uri:content://sms/outbox package com.itheima28.contentobserverdemo;import android.app.Activity;import android.content.ContentResolver;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.util.Log;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 监听系统短信ContentResolver resolver = getContentResolver();// 注册一个内容观察者观察短信数据库resolver.registerContentObserver(Uri.parse("content://sms/"), true, new MyContentObserver(new Handler()));}/** * @author andong * 内容观察者 */class MyContentObserver extends ContentObserver {private static final String TAG = "MyContentObserver";public MyContentObserver(Handler handler) {super(handler);}/** * 当被监听的内容发生改变时回调 */@Overridepublic void onChange(boolean selfChange) {Log.i(TAG, "短信改变了");Uri uri = Uri.parse("content://sms/outbox");// 发件箱的uri// 查询发件箱的内容Cursor cursor = getContentResolver().query(uri, new String[]{"address", "date", "body"}, null, null, null);if(cursor != null && cursor.getCount() > 0) {String address;long date;String body;while(cursor.moveToNext()) {address = cursor.getString(0);date = cursor.getLong(1);body = cursor.getString(2);Log.i(TAG, "号码: " + address + ", 日期: " + date + ", 内容: " + body);}cursor.close();}}}}登录后复制 网络图片查看器 Android notResponding(应用程序无响应) 阻塞了主线程 ANR异常 异常: CalledFromWrongThreadException: Only theoriginal thread that created a view hierarchy can touch its views. 只有原始的线程(主线程, ui线程)才能修改view对象. 在子线程中修改view的显示状态, 会报上面异常. 子线程网络图片查看器和Handler消息处理器 登录后复制 登录后复制 package com.itheima28.netphoto;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import javax.net.ssl.HttpsURLConnection;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.EditText;import android.widget.ImageView;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {private static final String TAG = "MainActivity";protected static final int ERROR = 1;private EditText etUrl;private ImageView ivIcon;private final int SUCCESS = 0;private Handler handler = new Handler() {/** * 接收消息 */@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);Log.i(TAG, "what = " + msg.what);if(msg.what == SUCCESS) {// 当前是访问网络, 去显示图片ivIcon.setImageBitmap((Bitmap) msg.obj);// 设置imageView显示的图片} else if(msg.what == ERROR) {Toast.makeText(MainActivity.this, "抓去失败", 0).show();}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ivIcon = (ImageView) findViewById(R.id.iv_icon);etUrl = (EditText) findViewById(R.id.et_url);findViewById(R.id.btn_submit).setOnClickListener(this);}@Overridepublic void onClick(View v) {final String url = etUrl.getText().toString();new Thread(new Runnable() {@Overridepublic void run() {Bitmap bitmap = getImageFromNet(url);//ivIcon.setImageBitmap(bitmap);// 设置imageView显示的图片if(bitmap != null) {Message msg = new Message();msg.what = SUCCESS;msg.obj = bitmap;handler.sendMessage(msg);} else {Message msg = new Message();msg.what = ERROR;handler.sendMessage(msg);}}}).start();}/** * 根据url连接取网络抓去图片返回 * @param url * @return url对应的图片 */private Bitmap getImageFromNet(String url) {HttpURLConnection conn = null;try {URL mURL = new URL(url);// 创建一个url对象// 得到http的连接对象conn = (HttpURLConnection) mURL.openConnection();conn.setRequestMethod("GET");// 设置请求方法为Getconn.setConnectTimeout(10000);// 设置连接服务器的超时时间, 如果超过10秒钟, 没有连接成功, 会抛异常conn.setReadTimeout(5000);// 设置读取数据时超时时间, 如果超过5秒, 抛异常conn.connect();// 开始链接int responseCode = conn.getResponseCode(); // 得到服务器的响应码if(responseCode == 200) {// 访问成功InputStream is = conn.getInputStream();// 获得服务器返回的流数据Bitmap bitmap = BitmapFactory.decodeStream(is); // 根据 流数据 创建一个bitmap位图对象return bitmap;} else {Log.i(TAG, "访问失败: responseCode = " + responseCode);}} catch (Exception e) {e.printStackTrace();} finally {if(conn != null) {conn.disconnect();// 断开连接}}return null;}}登录后复制 html查看器 登录后复制 登录后复制 package com.itheima28.htmldemo;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {private static final String TAG = "MainActivity";private static final int SUCCESS = 0;protected static final int ERROR = 1;private EditText etUrl;private TextView tvHtml;private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case SUCCESS: tvHtml.setText((String) msg.obj);break;case ERROR:Toast.makeText(MainActivity.this, "访问失败", 0).show();break;default:break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);etUrl = (EditText) findViewById(R.id.et_url);tvHtml = (TextView) findViewById(R.id.tv_html);}public void getHtml(View v) {final String url = etUrl.getText().toString();new Thread(new Runnable() {@Overridepublic void run() {// 请求网络String html = getHtmlFromInternet(url);if(!TextUtils.isEmpty(html)) {// 更新textview的显示了Message msg = new Message();msg.what = SUCCESS;msg.obj = html;handler.sendMessage(msg);} else {Message msg = new Message();msg.what = ERROR;handler.sendMessage(msg);}}}).start();}/** * 根据给定的url访问网络, 抓去html代码 * @param url * @return */protected String getHtmlFromInternet(String url) {try {URL mURL = new URL(url);HttpURLConnection conn = (HttpURLConnection) mURL.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(10000);conn.setReadTimeout(5000);//conn.connect();int responseCode = conn.getResponseCode();if(responseCode == 200) {InputStream is = conn.getInputStream();String html = getStringFromInputStream(is);return html;} else {Log.i(TAG, "访问失败: " + responseCode);}} catch (Exception e) {e.printStackTrace();}return null;}/** * 根据流返回一个字符串信息 * @param is * @return * @throws IOException */private String getStringFromInputStream(InputStream is) throws IOException {ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = -1;while((len = is.read(buffer)) != -1) {baos.write(buffer, 0, len);}is.close();String html = baos.toString();// 把流中的数据转换成字符串, 采用的编码是: utf-8String charset = "utf-8";if(html.contains("gbk") || html.contains("gb2312")|| html.contains("GBK") || html.contains("GB2312")) {// 如果包含gbk, gb2312编码, 就采用gbk编码进行对字符串编码charset = "gbk";}html = new String(baos.toByteArray(), charset);// 对原有的字节数组进行使用处理后的编码名称进行编码baos.close();return html;}}登录后复制 html查看器乱码问题 /** * 根据流返回一个字符串信息 * @param is * @return * @throws IOException */private String getStringFromInputStream(InputStream is) throws IOException {ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = -1;while((len = is.read(buffer)) != -1) {baos.write(buffer, 0, len);}is.close();String html = baos.toString();// 把流中的数据转换成字符串, 采用的编码是: utf-8String charset = "utf-8";if(html.contains("gbk") || html.contains("gb2312")|| html.contains("GBK") || html.contains("GB2312")) {// 如果包含gbk, gb2312编码, 就采用gbk编码进行对字符串编码charset = "gbk";}html = new String(baos.toByteArray(), charset);// 对原有的字节数组进行使用处理后的编码名称进行编码baos.close();return html;}登录后复制 使用HttpURLConnection采用Post方式请求数据 Servlet服务器程序 package com.itheima28.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class LoginServlet extends HttpServlet {/** * The doGet method of the servlet. * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String username = request.getParameter("username");// 采用的编码是: iso-8859-1String password = request.getParameter("password");// 采用iso8859-1的编码对姓名进行逆转, 转换成字节数组, 再使用utf-8编码对数据进行转换, 字符串username = new String(username.getBytes("iso8859-1"), "utf-8");password = new String(password.getBytes("iso8859-1"), "utf-8");System.out.println("姓名: " + username);System.out.println("密码: " + password);if("lisi".equals(username) && "123".equals(password)) {/* * getBytes 默认情况下, 使用的iso8859-1的编码, 但如果发现码表中没有当前字符, * 会使用当前系统下的默认编码: GBK */ response.getOutputStream().write("登录成功".getBytes("utf-8"));} else {response.getOutputStream().write("登录失败".getBytes("utf-8"));}}/** * The doPost method of the servlet. * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("doPost");doGet(request, response);}}登录后复制 Android客户端 登录后复制 登录后复制 package com.itheim28.submitdata.utils;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;import java.net.URLEncoder;import android.util.Log;public class NetUtils {private static final String TAG = "NetUtils";/** * 使用post的方式登录 * @param userName * @param password * @return */public static String loginOfPost(String userName, String password) {HttpURLConnection conn = null;try {URL url = new URL("http://10.0.2.2:8080/ServerItheima28/servlet/LoginServlet");conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("POST");conn.setConnectTimeout(10000); // 连接的超时时间conn.setReadTimeout(5000); // 读数据的超时时间conn.setDoOutput(true);// 必须设置此方法, 允许输出//conn.setRequestProperty("Content-Length", 234);// 设置请求头消息, 可以设置多个// post请求的参数String data = "username=" + userName + "&password=" + password;// 获得一个输出流, 用于向服务器写数据, 默认情况下, 系统不允许向服务器输出内容OutputStream out = conn.getOutputStream();out.write(data.getBytes());out.flush();out.close();int responseCode = conn.getResponseCode();if(responseCode == 200) {InputStream is = conn.getInputStream();String state = getStringFromInputStream(is);return state;} else {Log.i(TAG, "访问失败: " + responseCode);}} catch (Exception e) {e.printStackTrace();} finally {if(conn != null) {conn.disconnect();}}return null;}/** * 使用get的方式登录 * @param userName * @param password * @return 登录的状态 */public static String loginOfGet(String userName, String password) {HttpURLConnection conn = null;try {String data = "username=" + URLEncoder.encode(userName) + "&password=" + URLEncoder.encode(password);URL url = new URL("http://10.0.2.2:8080/ServerItheima28/servlet/LoginServlet?" + data);conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");// get或者post必须得全大写conn.setConnectTimeout(10000); // 连接的超时时间conn.setReadTimeout(5000); // 读数据的超时时间int responseCode = conn.getResponseCode();if(responseCode == 200) {InputStream is = conn.getInputStream();String state = getStringFromInputStream(is);return state;} else {Log.i(TAG, "访问失败: " + responseCode);}} catch (Exception e) {e.printStackTrace();} finally {if(conn != null) {conn.disconnect();// 关闭连接}}return null;}/** * 根据流返回一个字符串信息 * @param is * @return * @throws IOException */private static String getStringFromInputStream(InputStream is) throws IOException {ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = -1;while((len = is.read(buffer)) != -1) {baos.write(buffer, 0, len);}is.close();String html = baos.toString();// 把流中的数据转换成字符串, 采用的编码是: utf-8//String html = new String(baos.toByteArray(), "GBK");baos.close();return html;}}登录后复制 package com.itheim28.submitdata;import com.itheim28.submitdata.utils.NetUtils;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity {private EditText etUserName;private EditText etPassword;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);etUserName = (EditText) findViewById(R.id.et_username);etPassword = (EditText) findViewById(R.id.et_password);}public void doGet(View v) {final String userName = etUserName.getText().toString();final String password = etPassword.getText().toString();new Thread(new Runnable() {@Overridepublic void run() {// 使用get方式抓去数据final String state = NetUtils.loginOfGet(userName, password);// 执行任务在主线程中runOnUiThread(new Runnable() {@Overridepublic void run() {// 就是在主线程中操作Toast.makeText(MainActivity.this, state, 0).show();}});}}).start();}public void doPost(View v) {final String userName = etUserName.getText().toString();final String password = etPassword.getText().toString();new Thread(new Runnable() {@Overridepublic void run() {final String state = NetUtils.loginOfPost(userName, password);// 执行任务在主线程中runOnUiThread(new Runnable() {@Overridepublic void run() {// 就是在主线程中操作Toast.makeText(MainActivity.this, state, 0).show();}});}}).start();}}登录后复制 开源项目简介 github.com 开源网站, 一个大的仓库. 存放的都是框架 android-async-http-master.zip android-smart-image-view-master.zip 直接拿来用 最火的android开源项目 csdn的帖子
09-12 07:47