Taolin的博客

生命不息 奋斗不止


  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

Android蓝牙的配对与连接

发表于 2015-12-23   |   分类于 android   |  

这段时间在项目中做蓝牙的设置模块,功能跟系统设置中的蓝牙设置部分差不多,由于此项目只是一个普通app,蓝牙设置中的很多api只有系统app才能调用,如何在普通app中做蓝牙的设置项,记录如下

1. AndroidManifest中添加蓝牙管理权限

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

2. 打开蓝牙

打开蓝牙有两种方式,发送蓝牙开启请求或代码后台自动打开蓝牙。

2.1. 发送蓝牙开启请求

先判断BluetoothAdapter是不是为空,为空有可能是系统没有蓝牙模块,再判断蓝牙的状态是不是开启的,不是开启的就发送请求。

BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
if (btAdapter != null && !btAdapter.isEnabled()) {
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(intent)
}

01.png

2.2. 后台自动打开蓝牙

if (btAdapter != null && !btAdapter.isEnabled()) {
btAdapter.enable();
}
阅读全文 »

Vim快键键汇总(持续更新)

发表于 2015-08-23   |   分类于 vim   |  

1. 移动光标

  • h    左移
  • j    下移
  • k    上移
  • l    右移
  • $    移动到当前行行尾
  • ^    移动到当前行的第一个非空白字符上
  • 0    移动到当前行的行首,同Home键
  • gg    移动到文档的第一行
  • G    移动到文档的最后一行
  • H    移动到当前屏幕中的第一行
  • M    移动到当前屏幕中的中间行
  • L    移动到当前屏幕中的最后一行
  • 行数+G    将光标移动到文档的指定行,比如移动到23行(23G)
  • 数字+%    将光标移动到文档百分比位置,比如移动到文档12%的位置(12%)
  • `.    跳转至上次编辑位置
  • {    跳到上一个代码块
  • }    跳到下一个代码块
  • %    跳到与当前括号匹配的括号处,如当前在’{‘,则跳转到与之匹配的’}’处
  • Ctrl+g    获取当前位置信息
  • zz, zt, zb    滚动文档,将光标所在行居中/置顶/置尾
  • f[x]    向右移动至字母x在当前行内下一次出现的位置,f指forward,x可以是任一个字母,你还可以用;来重复执行刚才的fx
  • tx    同fx,区别在于光标会停留到x的左侧
  • Fx    同fx,只是向左移动
  • ma和’a    标记一个位置,在同页面快速定位到该标志。m表示mark,a是一个字母,’是单引号,后面跟上前面标记的字母
  • gd    查看方法的调用

2. 内容搜索

  • /string    向前搜索指定字符串
  • ?string    向后搜索指定字符串
  • /\<make\>    搜索make,前后不包含其他字母
  • *    查找光标所在处的单词,向下查找
  • #    查找光标所在处的单词,向上查找
    n/N配合以上查找命令执行
  • n    搜索指定字符串的下一个出现位置
  • N    搜索指定字符串的上一个出现位置

3. 查找替换

  • :%s/old/new/g    全文替换指定字符串
  • :s/vivian/sky/    替换当前行第一个vivian 为sky
  • :s/vivian/sky/g    替换当前行所有vivian 为sky
  • :n,$s/vivian/sky/    替换第 n 行开始到最后一行中每一行的第一个vivian为sky, n为数字,若n为.,表示从当前行开始到最后一行
  • :2,$s/vivian/sky/g    替换第 2 行开始到最后一行中每一行所有vivian为sky
  • :%s/vivian/sky/    (等同于 :g/vivian/s//sky/) 替换每一行的第一个vivian 为sky
  • :%s/vivian/sky/g    (等同于 :g/vivian/s//sky/g) 替换每一行中所有vivian 为sky
  • (<w+>)_s*1    查找重复的连续单词,如:this this,输入/\(\<\w\+\>\)\_s*\1
    阅读全文 »

用Socket实现TCP,UDP通信

发表于 2015-02-16   |   分类于 java   |  

1. 用Socket实现UDP通信

UDP适用于一次传送少量数据、对可靠性要求不高的应用环境。

public class UDPServer {
public static void main(String[] args) {
try {
DatagramSocket ds = new DatagramSocket();
byte[] buffer = "udp test".getBytes();
DatagramPacket dp = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("localhost"), 8000);
// 将localhost换为255.255.255.255可以发送广播,对该局域网内所有机器发送消息
ds.send(dp);
ds.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class UDPClient {
public static void main(String[] args) {
try {
DatagramSocket ds = new DatagramSocket(8000);
byte[] buffer = new byte[1024];
DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(), 0, dp.getLength());
int port = dp.getPort();
System.out.println("ip: " + ip + "; data: " + data + "; port: " + port);
ds.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
阅读全文 »

Android 下拉刷新控件的使用

发表于 2014-08-06   |   分类于 android   |  
01.png

如上图,是Android下拉刷新控件PullToRefresh,这种控件使用比较普遍,Google+、知乎等都有使用。
Github地址: https://github.com/chrisbanes/ActionBar-PullToRefresh.git
下面介绍此控件的用法:

1. PullToRefresh基本用法

//在build.gradle中添加依赖库
compile 'com.github.chrisbanes.actionbarpulltorefresh:library:+'
//在xml中引用如下:
<uk.co.senab.actionbarpulltorefresh.library.PullToRefreshLayout
android:id="@+id/pull_refresh_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</uk.co.senab.actionbarpulltorefresh.library.PullToRefreshLayout>
//在Java代码中引用如下:
pullRefreshLayout = (PullToRefreshLayout) findViewById(R.id.pull_refresh_layout);
ActionBarPullToRefresh.from(this)
.allChildrenArePullable()
.listener(new OnRefreshListener() {
@Override
public void onRefreshStarted(View view) {
//add your refreshing code.
}
})
.setup(pullRefreshLayout);
阅读全文 »

ListView滚动事件的监听

发表于 2014-08-06   |   分类于 android   |  

ListView本身有一个OnScrollListener的接口,通过此接口可以监听ListView的状态,滚动的个数,但是没法监听其精确的滚动距离、上下滚动事件和滚动到表头或表尾事件,下面介绍如何监听这些事件。

1. 上下滚动事件的响应

  1. 自定义一个继承至ListView的类。
  2. 覆写onTouchEvent方法,监听触摸事件。
  3. 定义一个有效滚动距离,当滑动的距离超过这个距离时才会触发滚动事件的响应。
private int mEffectiveDistance = 10;
private float mPreviousY;
@Override
public boolean onTouchEvent(MotionEvent ev) {
mDetector.onTouchEvent(ev);
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
float currentY = ev.getY();
float distanceY = currentY - mPreviousY;
if (distanceY < -mEffectiveDistance) {
mPreviousY = currentY;
if (mCallbacks != null) {
mCallbacks.onScrollUp(); //触发向上滚动的事件
}
} else if (distanceY > mEffectiveDistance) {
mPreviousY = currentY;
if (mCallbacks != null) {
mCallbacks.onScrollDown(); //触发向下滚动的事件
}
}
break;
case MotionEvent.ACTION_DOWN:
mPreviousY = ev.getY();
break;
default:
break;
}
return super.onTouchEvent(ev);
}
阅读全文 »

Android中Drawable和Bitmap互相转化

发表于 2014-05-16   |   分类于 android   |  

1. 相关概念

  • Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象即可。
  • Canvas画布,绘图的目的区域。
  • Bitmap位图,用于图形的处理。
  • Matrix矩阵,进行图形变换。

2. Bitmap相关的转化

2.1. 从资源中获取Bitmap

Resources res = getResources();
Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.icon);

2.2. Bitmap 转为 byte[]

public byte[] Bitmap2Bytes(Bitmap bm) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray();
}
阅读全文 »

UPnP协议介绍和Android代码实现

发表于 2014-05-15   |   分类于 protocol   |  

1. UPnP简介

英文名称:Universal Plug and Play
中文译名:通用即插即用

UPnP是由“通用即插即用论坛”(UPnP™ Forum)推广的一套网络协议。该协议的目标是使家庭网络(数据共享、通信和娱乐)和公司网络中的各种设备能够相互无缝连接,并简化相关网络的实现。UPnP通过定义和发布基于开放、因特网通讯网协议标准的UPnP设备控制协议来实现这一目标。
UPnP体系允许 PC 间的点对点连接、网际互连和无线设备。它是一种基于TCP/IP、UDP和HTTP的分布式、开放体系。

2. UPnP的特点

UPnP使得任意两个设备能在LAN控制设备的管理下相互通信。其特性包括:

传输介质和设备独立
UPnP 技术可以应用在许多媒体上,包括电话线、电线(电力线通信PLC)、以太网、红外通信技术(IrDA)、无线电(Wi-Fi,蓝牙)和Firewire(1394)。无需任务设备驱动;而是采用共同的协议。

用户界面(UI)控制
UPnP 技术使得设备厂商可以通过网页浏览器来控制设备并进行交互。

操作系统和程序语言独立
任何操作系统和程序语言均可以用于构建UPnP产品。UPnP 并没有设定或限制运行于控制设备上的应用程序API;OS厂商可以创建满足他们客户需求的API。UPnP使得厂商可以像开发常规应用程序一样来控制设备UI和交互。

阅读全文 »

Android中shape图形的用法详解

发表于 2014-03-19   |   分类于 android   |  

Android可以通过代码生成一些简单的图片资源,节省空间,还方便后续修改。
下面介绍用shape生成图形的方法

1. shape图形的新建与引用

  • 在res/drawable下新建一个图片资源,如ic_back.xml;
  • 在代码中引用这个图片资源,如:android:src="@drawable/ic_back"。

2. shape图形的语法

<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
//共有4种类型,矩形(默认)/椭圆形/直线形/环形
android:shape=["rectangle" | "oval" | "line" | "ring"]
// 以下4个属性只有当类型为环形时才有效
android:innerRadius="dimension" //内环半径
android:innerRadiusRatio="float" //内环半径相对于环的宽度的比例,比如环的宽度为50,比例为2.5,那么内环半径为20
android:thickness="dimension" //环的厚度
android:thicknessRatio="float" //环的厚度相对于环的宽度的比例
android:useLevel="boolean"> //如果当做是LevelListDrawable使用时值为true,否则为false.
//定义圆角
<corners
android:radius="dimension" //全部的圆角半径
android:topLeftRadius="dimension" //左上角的圆角半径
android:topRightRadius="dimension" //右上角的圆角半径
android:bottomLeftRadius="dimension" //左下角的圆角半径
android:bottomRightRadius="dimension" /> //右下角的圆角半径
//定义渐变效果
<gradient
//共有3中渐变类型,线性渐变(默认)/放射渐变/扫描式渐变
android:type=["linear" | "radial" | "sweep"]
android:angle="integer" //渐变角度,必须为45的倍数,0为从左到右,90为从上到下
android:centerX="float" //渐变中心X的相当位置,范围为0~1
android:centerY="float" //渐变中心Y的相当位置,范围为0~1
android:startColor="color" //渐变开始点的颜色
android:centerColor="color" //渐变中间点的颜色,在开始与结束点之间
android:endColor="color" //渐变结束点的颜色
android:gradientRadius="float" //渐变的半径,只有当渐变类型为radial时才能使用
//使用LevelListDrawable时就要设置为true。设为false时才有渐变效果
android:useLevel=["true" | "false"] />
//内部边距
<padding
android:left="dimension"
android:top="dimension"
android:right="dimension"
android:bottom="dimension" />
//自定义的图形大小
<size
android:width="dimension"
android:height="dimension" />
//内部填充颜色
<solid
android:color="color" />
//描边
<stroke
android:width="dimension" //描边的宽度
android:color="color" //描边的颜色
// 以下两个属性设置虚线
android:dashWidth="dimension" //虚线的宽度,值为0时是实线
android:dashGap="dimension" /> //虚线的间隔
</shape>
阅读全文 »
12
Taolin

Taolin

生命不息 奋斗不止

18 日志
9 分类
48 标签
github weibo
© 2022 Taolin
由 Hexo 强力驱动
主题 - NexT.Mist