在frameworks/base/core/java/android/app/customized/ICustomizedService.aidl中添加接口
package android.app.customized;
interface ICustomizedService{
void setWifiWhiteList(inout List<String> wifiiNameList);
List<String> getWifiWhiteList();
boolean isWifiControl (String wifiName);
void removeWifiWhiteList (inout List<String> wifiiNameList);
void addWifiWhiteList (inout List<String> wifiiNameList);
}
在frameworks/base/core/java/android/app/customized/CustomizedManager.java中定义
package android.app.customized;
import android.util.Log;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.RemoteException;
import android.provider.Settings;
import java.io.IOException;
import android.os.ServiceManager;
import android.os.IBinder;
import java.util.List;
import android.app.ActivityManager;
import android.graphics.Bitmap;
public class CustomizedManager{
private static final String TAG="CustomizedManager";
private static final boolean DBG=true;
private static ICustomizedService mService;
private final Context mContext;
public CustomizedManager(Context context){
mContext = context;
mService = ICustomizedService.Stub.asInterface(
ServiceManager.getService("customized"));
}
private static ICustomizedService getService(){
if (mService != null) {
return mService;
}
IBinder b = ServiceManager.getService("customized");
if(b==null){
System.out.println("IBinder is null");
}else{
System.out.println("IBinder is not null");
}
mService = ICustomizedService.Stub.asInterface(b);
if(mService==null){
System.out.println("mService is null");
}else{
System.out.println("mService is not null");
}
return mService;
}
// 6 add interface setWifiWhiteList(List<String> wifiiNameList) {}
public void setWifiWhiteList(List<String> wifiiNameList) {
ICustomizedService service = getService();
try{
service.setWifiWhiteList(wifiiNameList);
}catch (RemoteException e) {}
}
// 7 add interface getWifiWhiteList () {}
public List<String> getWifiWhiteList () {
ICustomizedService service = getService();
try{
return service.getWifiWhiteList ();
}catch (RemoteException e) {}
return null;
}
// 8 add interface isWifiControl (String wifiName) {}
public boolean isWifiControl (String wifiName) {
ICustomizedService service = getService();
try{
return service.isWifiControl (wifiName);
}catch (RemoteException e) {}
return false;
}
// 9 add interface removeWifiWhiteList (List<String> wifiiNameList) {}
public void removeWifiWhiteList(List<String> wifiiNameList) {
ICustomizedService service = getService();
try{
service.removeWifiWhiteList(wifiiNameList);
}catch (RemoteException e) {}
}
// 10 add interface addWifiWhiteList (List<String> wifiiNameList) {}
public void addWifiWhiteList(List<String> wifiiNameList) {
ICustomizedService service = getService();
try{
service.addWifiWhiteList(wifiiNameList);
}catch (RemoteException e) {}
}
}
在frameworks/base/services/core/java/com/android/server/customized/CustomizedService.java实现接口
package com.android.server.customized;
import android.os.IBinder;
import android.os.ServiceManager;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.app.customized.ICustomizedService;
import android.content.BroadcastReceiver;
import java.util.List;
import java.util.ArrayList;
import android.content.ContentValues;
import com.android.server.SystemService;
import android.content.BroadcastReceiver;
import android.content.IntentFilter;
import java.util.Timer;
import java.util.TimerTask;
import android.content.ContentResolver;
import java.util.HashSet;
import android.content.pm.PackageInstaller;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
import android.content.IIntentSender;
import android.content.IIntentReceiver;
import android.content.IntentSender;
public class CustomizedService extends ICustomizedService.Stub {
private static final String TAG = "CustomizedService ";
private Context mContext;
private Uri mUri = Telephony.Carriers.CONTENT_URI;
private static final String PREFERRED_APN_URI = "content://telephony/carriers/preferapn";
private ContentResolver mContentResolver;
public static final String WEBSITE = "website";
public static final String IS_WHITE = "is_white";
public static final String WEBSITE_ID = "ws_id";
public final static String AUTHORITY = "com.android.providers.settings.MyControl";
public final static Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/controlbroswer");
public static List<String> appList = new ArrayList<String>();
public static List<String> markUrlList = new ArrayList<String>();
public static List<String> btpairlList = new ArrayList<String>();
public static List<String> noUninstallList = new ArrayList<String>();
public static List<String> wifiList = new ArrayList<String>();
public static List<String> controlBarList = new ArrayList<String>();
public static class Lifecycle extends SystemService {
private CustomizedService mService;
public Lifecycle(Context context) {
super(context);
}
@Override
public void onStart() {
mService = new CustomizedService (getContext());
publishBinderService(Context.CUSTOMIZED, mService);
}
@Override
public void onBootPhase(int phase) {
}
@Override
public void onUnlockUser(int userHandle) {
}
}
public CustomizedService (Context context) {
mContext = context;
}
private void sentControl(String action, String key, boolean iscontrol) {
long jh = Binder.clearCallingIdentity();
Intent i = new Intent();
i.setAction(action);
if (iscontrol) {
i.putExtra(key, true);
} else {
i.putExtra(key, false);
}
mContext.sendBroadcast(i);
sentControl (action,iscontrol);
Binder.restoreCallingIdentity(jh);
}
private void sentControl(String action, boolean iscontrol) {
long jh = Binder.clearCallingIdentity();
int key;
if (iscontrol) {
key = 0;
} else {
key = 1;
}
Log.i ("custom",",action "+ action + "; key"+key);
Settings.Secure.putInt(mContext.getContentResolver(),action,key);
Binder.restoreCallingIdentity(jh);
}
/**
* 6 add interface setWifiWhiteList(List<String> wifiiNameList) {}
*/
public void setWifiWhiteList(List<String> wifiiNameList){
Binder.clearCallingIdentity();
clearControlBrowserUrl("WIFI");
String ISWHITE = "WIFI";
wifiiNameList = delRepeat(wifiiNameList);
if(wifiiNameList != null){
int size = wifiiNameList.size();
for(int i =0; i < size; i++){
ContentValues values = new ContentValues();
values.put(WEBSITE_ID, i);
values.put(IS_WHITE,ISWHITE);
values.put(WEBSITE, wifiiNameList.get(i));
mContentResolver.insert(CONTENT_URI, values);
}
updateMarkUrl();
}
Binder.restoreCallingIdentity(DUMP_TRANSACTION);
}
/**
* 7 add interface getWifiWhiteList () {}
*/
public List<String> getWifiWhiteList(){
if(wifiList == null){
Log.d("gaodz","appList listUrl is null");
return null;
}
if(wifiList.size() < 1){
updateMarkUrl();
}
delRepeat(wifiList);
return wifiList;
}
/**
* 8 add interface isWifiControl (String wifiName) {}
*/
public boolean isWifiControl (String wifiName) {
Log.d("gaodz","isWifiControl wifiName = "+wifiName);
if(wifiName == null){
Log.d("gaodz","packageName url is null");
return false;
}
if(wifiList == null){
Log.d("gaodz","appList listUrl is null");
return false;
}
if(wifiList.size() < 1){
updateMarkUrl();
}
if(wifiList.size() < 1 ){
Log.d("gaodz","appList listUrl size is 0");
return false;
}
return wifiList.contains(wifiName);
}
/**
* 9 add interface removeWifiWhiteList (List<String> wifiiNameList) {}
*/
public void removeWifiWhiteList (List<String> wifiiNameList) {
if(wifiList == null || wifiiNameList == null){
Log.d("gaodz","wifiList listUrl is null");
return;
}
if(wifiList.size() < 1){
updateMarkUrl();
}
if(wifiList.size() < 1){
Log.d("gaodz","wifiList.size() < 1");
return;
}
Log.d("gaodz","removeWifiWhiteList");
for(int i=0;i<wifiiNameList.size();i++){
if(wifiList.contains(wifiiNameList.get(i))){
wifiList.remove(wifiiNameList.get(i));
}
}
setWifiWhiteList(wifiList);
}
/**
* 10 add interface addWifiWhiteList (List<String> wifiiNameList) {}
*/
public void addWifiWhiteList (List<String> wifiiNameList) {
if(wifiiNameList == null)return;
for(int j=0;j<wifiiNameList.size();j++){
wifiList.add(wifiiNameList.get(j));
}
setWifiWhiteList(wifiList);
}
public void clearControlBrowserUrl(String which){
Binder.clearCallingIdentity();
String[] selectionArgs = new String[]{which};
String selection = "" + IS_WHITE + "=?";
mContentResolver.delete(CONTENT_URI,selection,selectionArgs);
Binder.restoreCallingIdentity(DUMP_TRANSACTION);
}
public void updateMarkUrl(){
appList.clear();
markUrlList.clear();
btpairlList.clear();
noUninstallList.clear();
wifiList.clear();
controlBarList.clear();
Cursor cursor = mContentResolver.query(CONTENT_URI, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int index[] = new int[] { cursor.getColumnIndex(WEBSITE_ID),
cursor.getColumnIndex(IS_WHITE),
cursor.getColumnIndex(WEBSITE) };
do {
if (cursor.getString(index[1]).equals("APP")){
appList.add(cursor.getString(index[2]));
} else if (cursor.getString(index[1]).equals("IPL")) {
markUrlList.add(cursor.getString(index[2]));
} else if (cursor.getString(index[1]).equals("BT")) {
btpairlList.add(cursor.getString(index[2]));
} else if (cursor.getString(index[1]).equals("NODEL")) {
noUninstallList.add(cursor.getString(index[2]));
} else if (cursor.getString(index[1]).equals("WIFI")) {
wifiList.add(cursor.getString(index[2]));
} else if (cursor.getString(index[1]).equals("NOTI")) {
controlBarList.add(cursor.getString(index[2]));
}
} while (cursor.moveToNext());
}
cursor.close();
}
private List<String> delRepeat(List<String> list){
if(list == null)return null;
if(list.size() > 1){
HashSet h = new HashSet(list);
list.clear();
list.addAll(h);
}
return list;
}
private boolean getControl(String action){
return Settings.Secure.getInt(mContext.getContentResolver(), action, 1) == 0;
}
}
在frameworks/base/packages/SettingsProvider/AndroidManifest.xml添加provider
<provider android:name=".MyControl" android:authorities="com.android.providers.settings.MyControl"
android:multiprocess="false"
android:exported="true"
android:writePermission="android.permission.WRITE_SETTINGS"
android:initOrder="100" />
新建frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/MyControl.java
package com.android.providers.settings;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.net.Uri;
import android.util.Log;
public class MyControl extends ContentProvider {
public static final String ID = "_id";
public static final String WEBSITE_ID = "ws_id";
public static final String WEBSITE = "website";
public static final String IS_WHITE = "is_white";
public static final String DATABASE_NAME = "mycontrol.db";
private static final String TABLE_NAME = "controlbroswer";
public final static String AUTHORITY = "com.android.providers.settings.MyControl";
public final static Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/controlbroswer");
private static final int DB_VERSION = 2;
private SQLiteDatabase sqDb;
private SqliteHelper helper;
private static final String DATABASE_CREATE = "Create table " + TABLE_NAME
+ "( " + ID + " integer primary key autoincrement,"
+ WEBSITE_ID + " TEXT,"
+ IS_WHITE + " TEXT,"
+ WEBSITE + " TEXT);";
class SqliteHelper extends SQLiteOpenHelper {
public SqliteHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS" + TABLE_NAME);
onCreate(db);
}
}
@Override
public boolean onCreate() {
helper = new SqliteHelper(getContext(), DATABASE_NAME, null, DB_VERSION);
return helper == null ? false : true;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
sqDb = helper.getWritableDatabase();
int count = sqDb.delete(TABLE_NAME, selection, selectionArgs);
return count;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
sqDb = helper.getWritableDatabase();
long rowid = sqDb.insert(TABLE_NAME, WEBSITE_ID, values);
Uri insertUri = ContentUris.withAppendedId(uri, rowid);
return insertUri;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
sqDb = helper.getWritableDatabase();
Cursor cursor = sqDb.query(TABLE_NAME, projection, selection,
selectionArgs, null, null, sortOrder);
return cursor;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
sqDb = helper.getWritableDatabase();
int count = sqDb.update(TABLE_NAME, values, selection, selectionArgs);
return count;
}
@Override
public String getType(Uri uri) {
return "vnd.android.cursor.dir/controlbroswer";
}
}
在frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java中添加
import android.app.customized.CustomizedManager; //导入CustomizedManager
private CustomiezdManager customManager;
customManager = new CustomiezdManager(getActivity()); //初始化CustomiezdManager
for (AccessPoint accessPoint : accessPoints) {
if (customManager.getWifiWhiteList().size() > 0
&& !customManager.isWifiControl(accessPoint.getSsidStr())) {
continue;
}
}
修改packages/apps/Settings/src/com/android/settings/wifi/WifiSettings.java
import android.app.customized.CustomizedManager; //导入CustomizedManager
private CustomiezdManager customManager;
customManager = new CustomiezdManager(getActivity()); //初始化CustomiezdManager
for (AccessPoint accessPoint : accessPoints) {
if (customManager.getWifiWhiteList().size() > 0
&& !customManager.isWifiControl(accessPoint.getSsidStr())) {
continue;
}
}
其他的文件我就不一一添加了,前面的文章有提到如何自定义service,把其他的文件补齐,编译完成就可以调用接口了~