您的位置:首页 > 移动开发 > Android开发

android 常用工具方法集合1.0.1

2016-09-09 09:06 344 查看

 通过应用包名启动这个应用,可以启动系统应用

private void doStartApplicationWithPackageName(String packagename) {

//
通过包名获取此APP详细信息,包括Activities、services、versioncode、name等等

PackageInfo packageinfo = null;

try {

packageinfo = getPackageManager().getPackageInfo(packagename, 0);

} catch (PackageManager.NameNotFoundException e) {

e.printStackTrace();

}

if (packageinfo ==null) {

return;

}

//
创建一个类别为CATEGORY_LAUNCHER的该包名的Intent

Intent resolveIntent = new Intent(Intent.ACTION_MAIN,null);

resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);

resolveIntent.setPackage(packageinfo.packageName);

//
通过getPackageManager()的queryIntentActivities方法遍历

List<ResolveInfo> resolveinfoList = getPackageManager().queryIntentActivities(resolveIntent, 0);

ResolveInfo resolveinfo = resolveinfoList.iterator().next();

if (resolveinfo !=null) {

//
packagename =参数packname

String packageName = resolveinfo.activityInfo.packageName;

//
这个就是我们要找的该APP的LAUNCHER的Activity[组织形式:packagename.mainActivityname]

String className = resolveinfo.activityInfo.name;

// LAUNCHER Intent

Intent intent = new Intent(Intent.ACTION_MAIN);

intent.addCategory(Intent.CATEGORY_LAUNCHER);

//
设置ComponentName参数1:packagename参数2:MainActivity路径

ComponentName cn = new ComponentName(packageName, className);

intent.setComponent(cn);

startActivity(intent);

}

}

压缩图片,通常用来解决图片过大引起的OOM问题,防止内存溢出

private Bitmap imageZoom(Bitmap bitMap) {

//
图片允许最大空间 单位:KB

double maxSize = 400.00;

//
将bitmap放至数组中,意在bitmap的大小(与实际读取的原文件要大)

  ByteArrayOutputStream baos = new ByteArrayOutputStream();

bitMap.compress(Bitmap.CompressFormat.JPEG, 100, baos);

byte[] b = baos.toByteArray();

//
将字节换成KB

double mid = b.length / 1024;

//
判断bitmap占用空间是否大于允许最大空间 如果大于则压缩 小于则不压缩

if (mid > maxSize) {

//
获取bitmap大小 是允许最大大小的多少倍

double i = mid / maxSize;

//
获取这个图片的宽和高

float width = bitMap.getWidth();

float height = bitMap.getHeight();

//
创建操作图片用的matrix对象

Matrix matrix = new Matrix();

//
计算宽高缩放率

float scaleWidth = ((float) (bitMap.getWidth() / Math.sqrt(i))) / width;

float scaleHeight = ((float) (bitMap.getHeight() / Math.sqrt(i))) / height;

//
缩放图片动作

matrix.postScale(scaleWidth, scaleHeight);

bitMap = Bitmap.createBitmap(bitMap, 0, 0, (int) width, (int) height, matrix,true);

}

return bitMap;

}

动态设置GridView高度

public static void setGridViewHight(GridView listView) {

//
获取listview的adapter

ListAdapter listAdapter = listView.getAdapter();

if (listAdapter ==null) {

return;

}

//
固定列宽,有多少列

int col = 3;// listView.getNumColumns();

int totalHeight = 0;

// i每次加4,相当于listAdapter.getCount()小于等于4时
循环一次,计算一次item的高度,

// listAdapter.getCount()小于等于8时计算两次高度相加

for (int i = 0; i < listAdapter.getCount(); i += col) {

//
获取listview的每一个item

View listItem = listAdapter.getView(i,
null
, listView);

listItem.measure(0, 0);

//
获取item的高度和

totalHeight += listItem.getMeasuredHeight();

}

//
获取listview的布局参数

ViewGroup.LayoutParams params = listView.getLayoutParams();

//
设置高度

params.height = totalHeight;

//
设置margin

((ViewGroup.MarginLayoutParams) params).setMargins(10, 10, 10, 10);

//
设置参数

listView.setLayoutParams(params);

}

判断某个服务是否在运行,经测试发现这种方法只能检测服务有没有被杀死,不能检测内部的代码是否执行

public boolean isServiceWork(Context mContext, String serviceName) {

boolean isWork =false;

ActivityManager myAM = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);

List<RunningServiceInfo> myList = myAM.getRunningServices(100);

if (myList.size() <= 0) {

return false;

}

for (int i = 0; i < myList.size(); i++) {

String mName = myList.get(i).service.getClassName().toString();

// Log.e(TAG, "-----服务名称:" + mName);

if (mName.equals(serviceName)) {

isWork = true;

break;

}

}

return isWork;

}

打印异常信息,可以打印堆栈信息,详细输出哪一行代码出现bug,方便apk打包后调试

public static void showException(String TAG, Exception e) {

if (isShowLog) {

StringWriter sw = new StringWriter();

PrintWriter pw = new PrintWriter(sw);

e.printStackTrace(pw);

Log.e(TAG,
"---受捕获的异常:" + sw.toString());

}

}

获取一个app的签名

private String getAPKSign(String apkPath) {

String PATH_PackageParser =
"android.content.pm.PackageParser";

try {

//
apk包的文件路径

//
这是一个Package 解释器,是隐藏的

//
构造函数的参数只有一个, apk文件的路径

// PackageParser packageParser = new PackageParser(apkPath);

Class pkgParserCls = Class.forName(PATH_PackageParser);

Class[] typeArgs = new Class[1];

typeArgs[0] = String.class;

Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);

Object[] valueArgs = new Object[1];

valueArgs[0] = apkPath;

Object pkgParser = pkgParserCt.newInstance(valueArgs);

//
这个是与显示有关的, 里面涉及到一些像素显示等等,我们使用默认的情况

DisplayMetrics metrics = new DisplayMetrics();

metrics.setToDefaults();

// PackageParser.Package mPkgInfo = packageParser.parsePackage(new

// File(apkPath), apkPath,

// metrics, 0);

typeArgs = new Class[4];

typeArgs[0] = File.class;

typeArgs[1] = String.class;

typeArgs[2] = DisplayMetrics.class;

typeArgs[3] = Integer.TYPE;

Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod("parsePackage", typeArgs);

valueArgs = new Object[4];

valueArgs[0] = new File(apkPath);

valueArgs[1] = apkPath;

valueArgs[2] = metrics;

valueArgs[3] = PackageManager.GET_SIGNATURES;

Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser, valueArgs);

typeArgs = new Class[2];

typeArgs[0] = pkgParserPkg.getClass();

typeArgs[1] = Integer.TYPE;

Method pkgParser_collectCertificatesMtd = pkgParserCls.getDeclaredMethod("collectCertificates", typeArgs);

valueArgs = new[/b] Object[2];

valueArgs[0] = pkgParserPkg;

valueArgs[1] = PackageManager.GET_SIGNATURES;

pkgParser_collectCertificatesMtd.invoke(pkgParser, valueArgs);

//
应用程序信息包, 这个公开的,不过有些函数,变量没公开

Field packageInfoFld = pkgParserPkg.getClass().getDeclaredField("mSignatures");

Signature[] info = (Signature[]) packageInfoFld.get(pkgParserPkg);

return info[0].toCharsString();

} catch (Exception e) {

ToastUtil.showException(TAG, e);

}

return null;

}

int类型的秒数转换成标准时间格式mm:SS

public static String secToTime(int time) {

String timeStr = null;

int hour = 0;

int minute = 0;

int second = 0;

if (time <= 0){

return "00:00";

}else {

minute = time / 60;

}

if (minute < 60) {

second = time % 60;

timeStr = unitFormat(minute) +
":" + unitFormat(second);

} else {

hour = minute / 60;

if (hour > 99)

return "99:59:59";

minute = minute % 60;

second = time - hour * 3600 - minute * 60;

timeStr = unitFormat(hour) +
":" + unitFormat(minute) + ":" +unitFormat(second);

}

}

return timeStr;

}

public static String unitFormat(int i) {

String retStr = null;

if (i >= 0 && i < 10)

retStr =
"0" + Integer.toString(i);

else

retStr =
"" + i;

return retStr;

}

获取手机系统应用包名列表

public static List<String> getSysAppList(Context context) {

List<PackageInfo> packages = context.getPackageManager().getInstalledPackages(0);

List<String> list = new ArrayList<String>();

for (int i = 0; i < packages.size(); i++) {

PackageInfo packageInfo = packages.get(i);

if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)
!= 0) {

//
系统应用        

list.add(packageInfo.packageName);

ToastUtil.showLogE(TAG,"---系统包名" + packageInfo.packageName);

}

}

return list;

}

根据包名获取app名称

public static String getAppName(Context context, String packageName) {

PackageManager pm = context.getPackageManager();

String appName =
"";

try {

ApplicationInfo applicationInfo = pm.getApplicationInfo(packageName, 0);

appName = String.valueOf(pm.getApplicationLabel(applicationInfo));

} catch (Exception e) {

ToastUtil.showException(TAG, e);

e.printStackTrace();

}

return appName;

}

获取手机wifi状态下mac地址,4G状态下是没有mac地址的。,

public static String getMac(Context context) {

WifiManager wifiMan = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

WifiInfo info = wifiMan.getConnectionInfo();

String mac = info.getMacAddress();//获得MAC地址

return mac;

}

获取手机可用内存

public static String getAvailMemory(Context context) {//获取android当前可用内存大小

ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

MemoryInfo mi = new MemoryInfo();

am.getMemoryInfo(mi);

// mi.availMem;当前系统的可用内存

return Formatter.formatFileSize(context, mi.availMem);//将获取的内存大小规格化

}

获取系统内存总大小

public static String getTotalMemory(Context context) {

String str1 =
"/proc/meminfo";//
系统内存信息文件

String str2;

String[] arrayOfString;

long initial_memory = 0;

try {

FileReader localFileReader = new FileReader(str1);

BufferedReader localBufferedReader =
new
 BufferedReader(localFileReader, 8192);

str2 = localBufferedReader.readLine();//读取meminfo第一行,系统总内存大小

arrayOfString = str2.split("\\s+");

initial_memory = Integer.valueOf(arrayOfString[1]).intValue() * 1024;//获得系统总内存,单位是KB,乘以1024转换为Byte

localBufferedReader.close();

} catch (Exception e) {

}

return Formatter.formatFileSize(context, initial_memory);// Byte转换为KB或者MB,内存大小规格化

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 应用 代码 工具