不知不觉中,就收集了超过95条的自己感觉有意思的代码片段,分为五篇文章:android有用代码片段、Android有用代码片段(二)、Android有用代码片段(三)、Android有用代码片段(四)、
Android有用代码片段(五)。这五篇,今天,开始第六篇的整理!这里解释一下,因为一、二、三都是每个有20个片段,但是在四中,由于第70个代码过长,所以在第四篇中,只有10个片段。 第五篇里面有25个。
九十六、java.util.MissingFormatArgumentException 错误
在有站位符的打印语句中,经常会犯下一个错误。
如:System.out.printf( "y=%3d "+y),就会报这个错误。
应修改为:;改为System.out.printf( "y=%3d ",y)
九十七、Android判断是Pad或者手机
public boolean isTabletDevice() {
TelephonyManager telephony = (TelephonyManager) getContext().getSystemService(Context.TELEPHONY_SERVICE);
int type = telephony.getPhoneType();
if (type == TelephonyManager.PHONE_TYPE_NONE) {
return true;
} else {
return false;
}
}
九十八、判断android网络状态
State mWifiState = null;
State mMobileState = null;
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
mWifiState = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
mMobileState = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
.getState();
if (mWifiState != null && mMobileState != null && State.CONNECTED != mWifiState
&& State.CONNECTED == mMobileState) {
// 手机网络连接成功
} else if (mWifiState != null && mMobileState != null && State.CONNECTED != mWifiState && State.CONNECTED != mMobileState) {
mHandler.sendEmptyMessage(MSG_SHOW_NET_DIALOG);
} else if (mWifiState != null && State.CONNECTED == mWifiState) {
// 无线网络连接成功
}
九十九、ImageView的ScaleType属性
ImageView.ScaleType|android:scaleType值的意义:
ImageView.ScaleType.CENTER|android:scaleType="center"
ImageView.ScaleType.CENTER_CROP|android:scaleType="centerCrop"
ImageView.ScaleType.CENTER_INSIDE|android:scaleType="centerInside"
ImageView.ScaleType.FIT_CENTER|android:scaleType="fitCenter"
ImageView.ScaleType.FIT_END|android:scaleType="fitEnd"
ImageView.ScaleType.FIT_START|android:scaleType="fitStart"
ImageView.ScaleType.FIT_XY|android:scaleType="fitXY"
ImageView.ScaleType.MATRIX|android:scaleType="matrix"
一百、垂直进度条
- @Override
- protected synchronized void onDraw(Canvas canvas)
- {
- // TODO Auto-generated method stub
- canvas.rotate(-90);//反转90度,将水平ProgressBar竖起来
- canvas.translate(-getHeight(), 0);//将经过旋转后得到的VerticalProgressBar移到正确的位置,注意经旋转<span style="white-space:pre"> </span> 后宽高值互换
- super.onDraw(canvas);
- }
一零一、android获取本机Ip地址
public String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface
.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf
.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (SocketException ex) {
Log.e("WifiPreference IpAddress", ex.toString());
}
return null;
}
别忘了加权限:
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
- <uses-permission android:name="android.permission.INTERNET"></uses-permission>
有时候,有的手机会有ip6地址,所以在if()判断里面,最好这样写:
if (!inetAddress.isLoopbackAddress()&& InetAddressUtils
.isIPv4Address(inetAddress
.getHostAddress().toString())) {
一零二、开机启动
原理就是启动一个BroadcastReceiver来监听系统发出的开机广播:Android.intent.action.BOOT_COMPLETED
public class StartupReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//xxx 你要跳转到的activity
Intent i = new Intent(context,xxx.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//将intent以startActivity传送给操作系统
context.startActivity(i);
}
}
后面 在manifest里面注册BroadcastReceiver
<receiver android:name=".StartupReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>
最后,再添加上权限就可以了
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
一零三、Java对象赋值注意点
刚刚再看Think in Java 4的时候,提醒下自己!
对主数据类型的赋值是非常直接的。由于主类型容纳了实际的值,而且并非指向一个对象的句柄,所以在为其赋值的时候,可将来自一个地方的内容复制到另一个地方。例如,假设为主类型使用“A=B”,那么B处的内容就复制到A。若接着又修改了 A,那么 B 根本不会受这种修改的影响。作为一名程序员,这应成为自己的常识。
但在为对象“赋值”的时候,情况却发生了变化。对一个对象进行操作时,我们真正操作的是它的句柄。所以倘若“从一个对象到另一个对象”赋值,实际就是将句柄从一个地方复制到另一个地方。这意味着假若为对象使用“C=D”,那么C 和D最终都会指向最初只有 D 才指向的那个对象。下面这个例子将向大家阐示这一点。
把书中的例子稍微修改了下:
package cn.demo;
class Number {
int i;
}
public class Assignment {
public static void main(String[] args) {
Number n1 = new Number();
Number n2 = new Number();
n1.i = 9;
n2.i = 47;
System.out.println("1: n1.i: " + n1.i +
", n2.i: " + n2.i);
n1.i = n2.i;
System.out.println("2: n1.i: " + n1.i +
", n2.i: " + n2.i);
n1.i = 32;
System.out.println("3: n1.i: " + n1.i +
", n2.i: " + n2.i);
n1 = n2;
System.out.println("4: n1.i: " + n1.i +
", n2.i: " + n2.i);
n1.i = 27;
System.out.println("5: n1.i: " + n1.i +
", n2.i: " + n2.i);
}
}
打印结果:
1: n1.i: 9, n2.i: 47
2: n1.i: 47, n2.i: 47
3: n1.i: 32, n2.i: 47
4: n1.i: 47, n2.i: 47
5: n1.i: 27, n2.i: 27
一零四、Notification点击取消
一零五、保留表结构,删除表中所有内容
"DELETE FROM " + TABLE_NAME + " WHERE 1 = 1"
一零六、Android手机获取手机唯一识别号
在开发手机应用时,开发者最关心的是开发的手机软件有多少用户安装,并且正在使用。这就需要识别手机的唯一性。目前我了解的有两种方法,获取手机的imei号(imei号是唯一识别手机的号码)。获取android id号(android id 是手机系统的唯一号码)。
第一种方法:
android获取手机imei号的方法在在android系统中获取imei号和其他手机信息一文中做了详细的介绍。其中android在 2.0以上的版本中,获取手机imei号已经不需要相应的读取手机信息的权限了。
< uses-permission android:name="android.permission.READ_PHONE_STATE" />
但是目前1.6以下的版本用户占用户的近50%,如果想要让1.6以下版本的用户也可以获取imei号,那就要添加权限。
好处是唯一标识手机,缺点是可能需要相应的用户权限。
String myIMSI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMSI);
String myIMEI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMEI);
第二种方法:
可以获取android id号,如果一个手机设备第一次启动随即产生的一个数字,如果系统改变,该号可能会改变。
android id号解释:http://androidappdocs-staging.appspot.com/reference/android /provider/Settings.Secure.html#ANDROID_ID
获取方法:
String t=android.provider.Settings.System.getString(getContentResolver(), "android_id");
Log.i("huilurry","android_id="+t);
Ms测试结果:
07-13 13:12:49.835: INFO/huilurry(17455): android_id=20014289e714f20c
好处是所有版本都试用,缺点是可能会和其他机子重复或本机改变。via:http://wangjun.easymorse.com /?p=665
3、获取IMEI是把,telephonypackage的TelephonyManager类的getDeviceId() 方法
获得IMSI / IMEI(SIM和手机的唯一识别ID)
学习内容: 你将学到如何读出你手机里的SIM卡的IMSI (国际移动用户ID) 和IMEI (国际移动设备ID). IMSI 与 SIM唯一对应, IMEI 与 设备唯一对应.
可能应用的场合: 你可能需要 唯一的id 去授权/注册,或者用于你的Android-Activity的license目的 下面的两行代码将会使你获得SIM卡唯一 ID IMSI 和设备唯一ID IMEI
描述:
IMSI是一个 唯一的数字, 标识了GSM和UMTS 网络里的唯一一个用户. 它 存储 在手机的SIM卡里,它会通过手机发送到网络上.
IMEI也是一串唯一的数字, 标识了 GSM 和 UMTS网络里的唯一一个手机. 它通常被打印在手机里电池下面的那一面,拨 *#06# 也能看到它.
代码: 这里是你在Android里读出 唯一的 IMSI-ID / IMEI-ID 的方法。
Java:
String myIMSI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMSI);
String myIMEI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMEI);
一零七、 静默卸载系统软件和第三方软件
一个个卸载软件,弹出卸载软件提示好麻烦,现在特作出下列方法,可以静默卸载
静默安装敬请期待。。。。
//下面3句是静默卸载系统软件命令
String busybox="mount -o remount rw /system";
String chmod="chmod 777 /system/app/HtcTwitter.apk";
uninstallapk="rm -r /system/app/HtcTwitter.apk";
//下面3句是静默卸载第三方软件命令
String busybox1="mount -o remount rw /data";
String chmod1="chmod 777 /data/app/com.yingyonghui.market-2.apk";
uninstallapk1="pm uninstall com.yingyonghui.market";
chmodApk(busybox1,chmod1);
/*
* 对要卸载的apk赋予权限
*/
public void chmodApk(String busybox ,String chmod)
{
try {
Process process = null;
DataOutputStream os = null;
process = Runtime.getRuntime().exec("su");
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(busybox);
os.flush();
os.writeBytes(chmod);
os.flush();
os.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
/*
* 卸载apk
*/
public void uninstallApk(String uninstallapk)
{
try {
Process process = null;
DataOutputStream os = null;
process = Runtime.getRuntime().exec("su");
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(uninstallapk);
os.flush();
os.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
一零八、获取当前显示的activity
用ActivityManager里面可以获取到当前运行的所有任务,所有进程和所有服务,这是任务管理器的核心。
仔细看getRunningTasks的文档,里面说获取的是系统中"running"的所有task,"running"状态包括已经被系统冻结的task。而且返回的这个列表是按照顺序排列的,也就是说第一个肯定比第二个后运行。
getRunningTasks有个整型参数,表示返回列表的最大个数。那么,我们如果把1作为参数给进去,那么他返回的task就是当前运行的那个task,然后从task中获取到最顶层的activity,这个activity就是当前显示给用户的那个activity了。
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
Log.d("", "pkg:"+cn.getPackageName());
Log.d("", "cls:"+cn.getClassName());
一零九、android代码实现ViewPager的indictor效果
一一零、Android 手绘 - 支持保存为图片
一一一、android 遮罩层效果
一一二、 Android中从SD卡中/拍照选择图片并进行剪裁的方法
/**
* 实现文本复制功能
* @param content 要复制的内容
*/
public static void copy(String content, Context context) {
// 得到剪贴板管理器
ClipboardManager cmb = (ClipboardManager) context
.getSystemService(Context.CLIPBOARD_SERVICE);
cmb.setText(content.trim());
}
try {
ImageView img=(ImageView) findViewById(R.id.test_img_file);
//获取从本地获取的文件路径,用FileInputstream读入文件,并将图片文件转换成位图
Bundle bundle=getIntent().getExtras();
String path=bundle.getString("test");
FileInputStream fa=new FileInputStream(path);
Bitmap bm=BitmapFactory.decodeStream(fa);//原图
Bitmap wm=BitmapFactory.decodeResource(getResources(), R.drawable.wate_market);//水印
//将creatBitmap()方法的返回值(返回位图)放到图片控件显示
img.setImageBitmap(createBitMap(bm,wm));
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private Bitmap createBitMap(Bitmap src,Bitmap wmsrc){
/**
* 水印制作方法
*/
String tag="xx";
Log.d(tag, "开始了,画图");
if(src==null){
return null;
}
int w=src.getWidth();
int h=src.getHeight();
int wmw=wmsrc.getWidth();
int wmh=wmsrc.getHeight();
//create the new bitmap
Bitmap newb=Bitmap.createBitmap(w,h,Config.ARGB_8888);//创建一个底图
Canvas cv=new Canvas(newb);
//将底图画进去
cv.drawBitmap(src, 0, 0,null);//在0,0坐标开始画入src
//讲水印画进去
cv.drawBitmap(wmsrc, w-wmw+5, h-wmh+5, null);
//保存图片
cv.save(Canvas.ALL_SAVE_FLAG);
cv.restore();
return newb;
}
}
getDialog().getWindow().setBackgroundDrawable(new
ColorDrawable(Color.TRANSPARENT));