Android 系统工具类SystemUtils

包含的功能有:

获取系统中所有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 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 appList = new ArrayList();
        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 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 appList = new ArrayList();
        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);
    }
}
</file></file></file></appinfo></appinfo></resolveinfo></appinfo></appinfo></appinfo></resolveinfo></appinfo>

开机清除用户数据

添加开机广播

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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();
                    }
                }
            }
        }
    }
}
</packageinfo>

清除用户数据需要调用ActivityManager类中的clearApplicationUserData方法,但是这个方法被系统给隐藏类,调用不了,不过我们可以通过反射机制来调用
AndroidManifest.xml
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<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">
     
     
         
            <intent-filter>
                 
                <category android:name="android.intent.category.LAUNCHER">
            </category></action></intent-filter>
        </activity>
         
        <receiver android:name=".CleanDataReceiverd">
            <intent-filter>
                 
            </action></intent-filter>
        </receiver>
    </application>
 
</uses-permission></uses-permission></uses-sdk></manifest>

保存可能会报错,clean 一下项目就可以了
最后还需要在 Android.mk 中添加 一行

LOCAL_CERTIFICATE := platform

成功源于不断的学习和积累 !

上一篇:Android MVP模式


下一篇:安装MySQL后要做的事