转自:http://blog.youkuaiyun.com/h7870181/article/details/38555001
最近做的功能中涉及到了一些关于系统方面的东西,自己摸索以及网上搜集整理出来了一个工具类方便调用
包含的功能有:
获取系统中所有APP应用、获取用户安装的APP应用、根据包名和Activity启动类查询应用信息、跳转到WIFI设置、WIFI网络开关、移动网络开关、GPS开关 当前若关则打开 当前若开则关闭、调节系统音量、设置亮度、获取屏幕的亮度、跳转到系统设置、获取文件夹下所有文件、获取视频的缩略图 、打开视频文件...
工具类会持续更新,与大家共同学习进步。
SystemUtils.java
- package com.player.utils;
- import java.io.File;
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- import android.app.Activity;
- import android.app.PendingIntent;
- import android.app.PendingIntent.CanceledException;
- import android.content.ComponentName;
- import android.content.ContentResolver;
- import android.content.Context;
- import android.content.Intent;
- import android.content.pm.ActivityInfo;
- import android.content.pm.ApplicationInfo;
- import android.content.pm.PackageManager;
- import android.content.pm.PackageManager.NameNotFoundException;
- import android.content.pm.ResolveInfo;
- import android.graphics.Bitmap;
- import android.graphics.drawable.Drawable;
- import android.media.AudioManager;
- import android.media.ThumbnailUtils;
- import android.net.ConnectivityManager;
- import android.net.Uri;
- import android.net.wifi.WifiManager;
- import android.provider.Settings;
- import com.player.bean.AppInfo;
- public class SystemUtils {
- /**
- * 获取系统所有APP应用
- *
- * @param context
- */
- public static ArrayList<AppInfo> getAllApp(Context context) {
- PackageManager manager = context.getPackageManager();
- Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
- mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
- List<ResolveInfo> apps = manager.queryIntentActivities(mainIntent, 0);
- // 将获取到的APP的信息按名字进行排序
- Collections.sort(apps, new ResolveInfo.DisplayNameComparator(manager));
- ArrayList<AppInfo> appList = new ArrayList<AppInfo>();
- for (ResolveInfo info : apps) {
- AppInfo appInfo = new AppInfo();
- appInfo.setAppLable(info.loadLabel(manager) + "");
- appInfo.setAppIcon(info.loadIcon(manager));
- appInfo.setAppPackage(info.activityInfo.packageName);
- appInfo.setAppClass(info.activityInfo.name);
- appList.add(appInfo);
- System.out.println("info.activityInfo.packageName="+info.activityInfo.packageName);
- System.out.println("info.activityInfo.name="+info.activityInfo.name);
- }
- return appList;
- }
- /**
- * 获取用户安装的APP应用
- *
- * @param context
- */
- public static ArrayList<AppInfo> getUserApp(Context context) {
- PackageManager manager = context.getPackageManager();
- Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
- mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
- List<ResolveInfo> apps = manager.queryIntentActivities(mainIntent, 0);
- // 将获取到的APP的信息按名字进行排序
- Collections.sort(apps, new ResolveInfo.DisplayNameComparator(manager));
- ArrayList<AppInfo> appList = new ArrayList<AppInfo>();
- for (ResolveInfo info : apps) {
- AppInfo appInfo = new AppInfo();
- ApplicationInfo ainfo = info.activityInfo.applicationInfo;
- if ((ainfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {
- appInfo.setAppLable(info.loadLabel(manager) + "");
- appInfo.setAppIcon(info.loadIcon(manager));
- appInfo.setAppPackage(info.activityInfo.packageName);
- appInfo.setAppClass(info.activityInfo.name);
- appList.add(appInfo);
- }
- }
- return appList;
- }
- /**
- * 根据包名和Activity启动类查询应用信息
- *
- * @param cls
- * @param pkg
- * @return
- */
- public static AppInfo getAppByClsPkg(Context context, String pkg, String cls) {
- AppInfo appInfo = new AppInfo();
- PackageManager pm = context.getPackageManager();
- Drawable icon;
- CharSequence label = "";
- ComponentName comp = new ComponentName(pkg, cls);
- try {
- ActivityInfo info = pm.getActivityInfo(comp, 0);
- icon = pm.getApplicationIcon(info.applicationInfo);
- label = pm.getApplicationLabel(pm.getApplicationInfo(pkg, 0));
- } catch (NameNotFoundException e) {
- icon = pm.getDefaultActivityIcon();
- }
- appInfo.setAppClass(cls);
- appInfo.setAppIcon(icon);
- appInfo.setAppLable(label + "");
- appInfo.setAppPackage(pkg);
- return appInfo;
- }
- /**
- * 跳转到WIFI设置
- *
- * @param context
- */
- public static void intentWifiSetting(Context context) {
- if (android.os.Build.VERSION.SDK_INT > 10) {
- // 3.0以上打开设置界面,也可以直接用ACTION_WIRELESS_SETTINGS打开到wifi界面
- context.startActivity(new Intent(
- android.provider.Settings.ACTION_SETTINGS));
- } else {
- context.startActivity(new Intent(
- android.provider.Settings.ACTION_WIRELESS_SETTINGS));
- }
- }
- /**
- * WIFI网络开关
- *
- */
- public static void toggleWiFi(Context context, boolean enabled) {
- WifiManager wm = (WifiManager) context
- .getSystemService(Context.WIFI_SERVICE);
- wm.setWifiEnabled(enabled);
- }
- /**
- * 移动网络开关
- */
- public static void toggleMobileData(Context context, boolean enabled) {
- ConnectivityManager conMgr = (ConnectivityManager) context
- .getSystemService(Context.CONNECTIVITY_SERVICE);
- Class<?> conMgrClass = null; // ConnectivityManager类
- Field iConMgrField = null; // ConnectivityManager类中的字段
- Object iConMgr = null; // IConnectivityManager类的引用
- Class<?> iConMgrClass = null; // IConnectivityManager类
- Method setMobileDataEnabledMethod = null; // setMobileDataEnabled方法
- try {
- // 取得ConnectivityManager类
- conMgrClass = Class.forName(conMgr.getClass().getName());
- // 取得ConnectivityManager类中的对象mService
- iConMgrField = conMgrClass.getDeclaredField("mService");
- // 设置mService可访问
- iConMgrField.setAccessible(true);
- // 取得mService的实例化类IConnectivityManager
- iConMgr = iConMgrField.get(conMgr);
- // 取得IConnectivityManager类
- iConMgrClass = Class.forName(iConMgr.getClass().getName());
- // 取得IConnectivityManager类中的setMobileDataEnabled(boolean)方法
- setMobileDataEnabledMethod = iConMgrClass.getDeclaredMethod(
- "setMobileDataEnabled", Boolean.TYPE);
- // 设置setMobileDataEnabled方法可访问
- setMobileDataEnabledMethod.setAccessible(true);
- // 调用setMobileDataEnabled方法
- setMobileDataEnabledMethod.invoke(iConMgr, enabled);
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (NoSuchFieldException e) {
- e.printStackTrace();
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- /**
- * GPS开关 当前若关则打开 当前若开则关闭
- */
- public static void toggleGPS(Context context) {
- Intent gpsIntent = new Intent();
- gpsIntent.setClassName("com.android.settings",
- "com.android.settings.widget.SettingsAppWidgetProvider");
- gpsIntent.addCategory("android.intent.category.ALTERNATIVE");
- gpsIntent.setData(Uri.parse("custom:3"));
- try {
- PendingIntent.getBroadcast(context, 0, gpsIntent, 0).send();
- } catch (CanceledException e) {
- e.printStackTrace();
- }
- }
- /**
- * 调节系统音量
- *
- * @param context
- */
- public static void holdSystemAudio(Context context) {
- AudioManager audiomanage = (AudioManager) context
- .getSystemService(Context.AUDIO_SERVICE);
- // 获取系统最大音量
- // int maxVolume = audiomanage.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
- // 获取当前音量
- // int currentVolume = audiomanage.getStreamVolume(AudioManager.STREAM_RING);
- // 设置音量
- // audiomanage.setStreamVolume(AudioManager.STREAM_SYSTEM, currentVolume, AudioManager.FLAG_PLAY_SOUND);
- // 调节音量
- // ADJUST_RAISE 增大音量,与音量键功能相同
- // ADJUST_LOWER 降低音量
- audiomanage.adjustStreamVolume(AudioManager.STREAM_SYSTEM,
- AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
- }
- /**
- * 设置亮度(每30递增)
- *
- * @param resolver
- * @param brightness
- */
- public static void setBrightness(Activity activity) {
- ContentResolver resolver = activity.getContentResolver();
- Uri uri = android.provider.Settings.System
- .getUriFor("screen_brightness");
- int nowScreenBri = getScreenBrightness(activity);
- nowScreenBri = nowScreenBri <= 225 ? nowScreenBri + 30 : 30;
- System.out.println("nowScreenBri==" + nowScreenBri);
- android.provider.Settings.System.putInt(resolver, "screen_brightness",
- nowScreenBri);
- resolver.notifyChange(uri, null);
- }
- /**
- * 获取屏幕的亮度
- *
- * @param activity
- * @return
- */
- public static int getScreenBrightness(Activity activity) {
- int nowBrightnessValue = 0;
- ContentResolver resolver = activity.getContentResolver();
- try {
- nowBrightnessValue = android.provider.Settings.System.getInt(
- resolver, Settings.System.SCREEN_BRIGHTNESS);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return nowBrightnessValue;
- }
- /**
- * 跳转到系统设置
- *
- * @param context
- */
- public static void intentSetting(Context context) {
- String pkg = "com.android.settings";
- String cls = "com.android.settings.Settings";
- ComponentName component = new ComponentName(pkg, cls);
- Intent intent = new Intent();
- intent.setComponent(component);
- context.startActivity(intent);
- }
- /**
- * 获取文件夹下所有文件
- * @param path
- * @return
- */
- public static ArrayList<File> getFilesArray(String path){
- File file = new File(path);
- File files[] = file.listFiles();
- ArrayList<File> listFile = new ArrayList<File>();
- if (files != null) {
- for (int i = 0; i < files.length; i++) {
- if (files[i].isFile()) {
- listFile.add(files[i]);
- }
- if (files[i].isDirectory()) {
- listFile.addAll(getFilesArray(files[i].toString()));
- }
- }
- }
- return listFile;
- }
- /**
- * 获取视频的缩略图
- * 先通过ThumbnailUtils来创建一个视频的缩略图,然后再利用ThumbnailUtils来生成指定大小的缩略图。
- * 如果想要的缩略图的宽和高都小于MICRO_KIND,则类型要使用MICRO_KIND作为kind的值,这样会节省内存。
- * @param videoPath 视频的路径
- * @param width 指定输出视频缩略图的宽度
- * @param height 指定输出视频缩略图的高度度
- * @param kind 参照MediaStore.Images.Thumbnails类中的常量MINI_KIND和MICRO_KIND。
- * 其中,MINI_KIND: 512 x 384,MICRO_KIND: 96 x 96
- * @return 指定大小的视频缩略图
- */
- public static Bitmap getVideoThumbnail(String videoPath, int width, int height,
- int kind) {
- Bitmap bitmap = null;
- // 获取视频的缩略图
- bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, kind);
- //System.out.println("w"+bitmap.getWidth());
- //System.out.println("h"+bitmap.getHeight());
- bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
- ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
- return bitmap;
- }
- /**
- * 打开视频文件
- * @param context
- * @param file 视频文件
- */
- public static void intentVideo(Context context, File file){
- Intent intent = new Intent(Intent.ACTION_VIEW);
- String type = "video/*";
- Uri uri = Uri.fromFile(file);
- intent.setDataAndType(uri, type);
- context.startActivity(intent);
- }
- }
开机清除用户数据
添加开机广播
- package com.topwise.airlinemanager;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.List;
- import android.app.ActivityManager;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.content.pm.IPackageDataObserver;
- import android.content.pm.PackageInfo;
- import android.content.pm.PackageManager;
- import android.util.Log;
- /**
- * 开机广播
- * @author XiaoSai
- *
- */
- public class CleanDataReceiverd extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
- //清除用户数据
- cleanUserData(context);
- }
- }
- class ClearUserDataObserver extends IPackageDataObserver.Stub {
- public void onRemoveCompleted(final String packageName,
- final boolean succeeded) {
- }
- }
- private void cleanUserData(Context context) {
- PackageManager manager = context.getPackageManager();
- List<PackageInfo> packages = manager.getInstalledPackages(0);
- ClearUserDataObserver mClearDataObserver = new ClearUserDataObserver();
- ActivityManager am = (ActivityManager) context
- .getSystemService(Context.ACTIVITY_SERVICE);
- Method targetMethod = null;
- Class<?> temp = am.getClass();
- // String className = temp.getName();
- Method[] methods = temp.getMethods();
- for (int j = 0; j < methods.length; j++) {
- if (("clearApplicationUserData".equals(methods[j].getName()))) {
- targetMethod = methods[j];
- break;
- }
- }
- String pkg = null;
- if (packages != null && packages.size() > 0) {
- for (int i = 0; i < packages.size(); i++) {
- pkg = packages.get(i).packageName;
- if (pkg.equals("com.sina.weibotab")
- || pkg.equals("com.tencent.android.pad")
- || pkg.equals("com.tencent.hd.qq")
- || pkg.equals("com.tencent.WBlog")
- || pkg.equals("com.tencent.mm")) {
- try {
- targetMethod.invoke(am, pkg, mClearDataObserver);
- Log.i("XIAOS", "clean pgk "+pkg);
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
- }
清除用户数据需要调用ActivityManager类中的clearApplicationUserData方法,但是这个方法被系统给隐藏类,调用不了,不过我们可以通过反射机制来调用
AndroidManifest.xml
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.player.playlauncher"
- android:versionCode="1"
- android:versionName="1.0"
- android:sharedUserId="android.uid.system">
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="17" />
- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
- <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name="com.player.playlauncher.FirstLevel"
- android:label="@string/app_name"
- android:icon="@drawable/ic_launcher">
- <intent-filter >
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <receiver
- android:name=".CleanDataReceiverd">
- <intent-filter>
- <action android:name="android.intent.action.BOOT_COMPLETED" />
- </intent-filter>
- </receiver>
- </application>
- </manifest>
保存可能会报错,clean 一下项目就可以了
最后还需要在 Android.mk 中添加 一行
LOCAL_CERTIFICATE := platform
成功源于不断的学习和积累 !