XXXX公司需求接口实现(二)

11) 网址/IP白名单接口

---------- frameworks/base/core/java/android/provider/Settings.java

 		/** @hide */
         public static final String PRIZE_NET_WHITELIST_ON = "prize_net_whiteon";

 -------------frameworks/base/packages/SettingsProvider/res/values/defaults.xml

<bool name="net_white_on">false</bool>

--------frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

loadBooleanSetting(stmt, Settings.System.PRIZE_NET_WHITELIST_ON, R.bool.net_white_on);

-------frameworks/base/core/java/android/os/INetworkManagementService.aidl

 	/**
      * setBrowserWhiteListEnable   add network white list 
      */
 	void setBrowserWhiteListEnable(String white_list, boolean allow);
 	/**
      * delBrowserWhiteListChainTable   del network white list 
      */
 	void delBrowserWhiteListChainTable(String white_list, boolean allow);

-------frameworks/base/services/core/java/com/android/server/NetworkManagementService.java

     @Override
     public void setBrowserWhiteListEnable(String white_list, boolean allow) {
         enforceSystemUid();
         final String rule = allow ? "allow" : "deny";
         try {
 			Slog.e("snail_", "-----setBrowserWhiteListEnable---white_list==" + white_list +"  bool=="+allow);
             mConnector.execute("firewall", "set_browserwhitelist_enable", white_list, rule);
         } catch (NativeDaemonConnectorException e) {
 			Slog.e("snail_", "-----setBrowserWhiteListEnable----Exception----white_list==" + white_list +"  bool=="+allow + ": " + e);
             throw e.rethrowAsParcelableException();
         }
     }
 	
 	@Override
     public void delBrowserWhiteListChainTable(String white_list, boolean allow) {
         enforceSystemUid();
         final String rule = allow ? "allow" : "deny";
         try {
 			Slog.e("snail_", "-----delBrowserWhiteListChainTable---white_list==" + white_list +"  bool=="+allow);
             mConnector.execute("firewall", "del_browserwhitelist_chaintable", white_list, rule);
         } catch (NativeDaemonConnectorException e) {
 			Slog.e("snail_", "-----delBrowserWhiteListChainTable----Exception----white_list==" + white_list +"  bool=="+allow + ": " + e);
             throw e.rethrowAsParcelableException();
         }
     }

 --------system/netd/server/FirewallController.h

 	int setBrowserWhiteListEnable(const char*, FirewallRule);
 	int delBrowserWhiteListChainTable(const char*, FirewallRule);

 --------system/netd/server/FirewallController.cpp

int FirewallController::setBrowserWhiteListEnable(const char* list, FirewallRule rule) {

    //const char *chaintable = "WEBWHITELIST";
	//const char *FORWARD_MARK = "1";
	const char* op;
    if (rule == ALLOW) {
		ALOGE("--snail_-----setBrowserWhiteListEnable------rule == allow-------");
        op = "-I";
    } else {
		ALOGE("--snail_-----setBrowserWhiteListEnable------rule == deny-------");
        op = "-D";
    }
    ALOGE("---snail_------set_browserwhitelist_enable-list===%s", list);
	const char *split = ","; 
	char *p; 
	char* white_list = const_cast<char*>(list); 
	p = strtok(white_list,split); 
	int res = 0;
		//iptables -t filter -N WEBWHITELIST
		//iptables -I OUTPUT -p tcp -j WEBWHITELIST
		//iptables -t mangle -N WEBWHITELIST
		//iptables -t mangle -I fw_mangle_POSTROUTING -p udp -j WEBWHITELIST
		res |= execIptables(V4V6, "-t", "mangle", "-N", "WEBWHITELIST",  NULL);
		ALOGE("---snail_-------New WEBWHITELIST---------res===%d", res);
		if(res == 0){
			res |= execIptables(V4V6, "-t", "mangle", "-I", "fw_mangle_POSTROUTING", "-p", "udp",  "-j", "WEBWHITELIST",  NULL);
			while(p!=NULL) { 
				ALOGE("---snail_-set_browserwhitelist_enable-p!=NULL===%s\n", p);
				//iptables -A WEBWHITELIST -p tcp -m string --string Host: --algo bm -j MARK --set-mark 1
				//iptables -A WEBWHITELIST -p tcp -m mark --mark 1 -m string --string baidu --algo bm -j ACCEPT
				//iptables -A WEBWHITELIST -p tcp -m mark --mark 1 -j REJECT
				//iptables -t mangle -A WEBWHITELIST -p udp --dport 53  -m string --string baidu --algo bm -j ACCEPT
				//iptables -t mangle -A WEBWHITELIST -p udp --dport 53  -m string --string taobao --algo bm -j ACCEPT
				//iptables -t mangle -A WEBWHITELIST -p udp --dport 53  -j DROP
				//res |= execIptables(V4V6, "-A", "WEBWHITELIST", "-p", "tcp", "-m", "string", "--string" ,"Host:", "--algo", "bm","-j", "MARK", "--set-mark", 			"1",  	NULL);
				//res |= execIptables(V4V6, "-A", "WEBWHITELIST", "-p", "tcp", "-m", "mark", "--mark" ,"1" , "-m", "string", "--string" , p, "--algo", "bm", 			"-j", "ACCEPT",  NULL);
				res |= execIptables(V4V6, "-t", "mangle", "-A", "WEBWHITELIST", "-p", "udp", "--dport", "53", "-m" ,"string", "--string" , p, "--algo", "bm", 			"-j", "ACCEPT",  NULL);
				
				p = strtok(NULL,split); 
			}		
			//res |= execIptables(V4V6, "-A", "WEBWHITELIST", "-p", "tcp", "-m", "mark", "--mark" ,"1", "-j", "REJECT",  NULL);
			res |= execIptables(V4V6, "-t", "mangle", "-A", "WEBWHITELIST", "-p", "udp", "--dport", "53", "-j", "DROP",  NULL);
		}
		ALOGE("---snail_------set_browserwhitelist_enable-list---end===%d", res);
    return res;
}

int FirewallController::delBrowserWhiteListChainTable(const char* list, FirewallRule rule) {

    const char* op;
	const char *DEL = "1";
    if (rule == ALLOW) {
		ALOGE("--snail_-----delBrowserWhiteListChainTable------rule == allow-------");
        op = "-I";
    } else {
		ALOGE("--snail_-----delBrowserWhiteListChainTable------rule == deny-------");
        op = "-D";
    }
    ALOGE("---snail_------delBrowserWhiteListChainTable-list===%s", list);
		//iptables -D OUTPUT 1
		//iptables -t filter -F WEBWHITELIST
		//iptables -t filter -X WEBWHITELIST
		//iptables -t mangle -D fw_mangle_POSTROUTING 1
		//iptables -t mangle -F WEBWHITELIST
		//iptables -t mangle -X WEBWHITELIST
	int res = 0;		
 	res |= execIptables(V4V6, "-t", "mangle", "-D", "fw_mangle_POSTROUTING", DEL,  NULL);
	res |= execIptables(V4V6, "-t", "mangle", "-F", "WEBWHITELIST", NULL);
	res |= execIptables(V4V6, "-t", "mangle", "-X", "WEBWHITELIST", NULL);
    return res;
}

 ----------system/netd/server/CommandListener.cpp

int CommandListener::FirewallCmd::runCommand(SocketClient *cli, int argc,
        char **argv) {
		if (!strcmp(argv[1], "set_browserwhitelist_enable")) {
		ALOGE("---snail_---------runCommand------set_browserwhitelist_enable---start-----"); 
        if (argc != 4) {
			ALOGE("---snail_---------runCommand------set_browserwhitelist_enable---Error---");
            cli->sendMsg(ResponseCode::CommandSyntaxError,
                         "Usage: firewall set_browserwhitelist_enable <rmnet0> <allow|deny>", false);
            return 0;
        }

        const char* white_list = argv[2];
        FirewallRule rule = parseRule(argv[3]);
        ALOGE("---snail_---------runCommand------set_browserwhitelist_enable-white_list===%s", argv[2]);
        int res = gCtls->firewallCtrl.setBrowserWhiteListEnable(white_list, rule);
        return sendGenericOkFail(cli, res);
    }
	
	if (!strcmp(argv[1], "del_browserwhitelist_chaintable")) {
		ALOGE("---snail_---------runCommand------del_browserwhitelist_chaintable---start-----"); 
        if (argc != 4) {
			ALOGE("---snail_---------runCommand------del_browserwhitelist_chaintable---Error---");
            cli->sendMsg(ResponseCode::CommandSyntaxError,
                         "Usage: firewall del_browserwhitelist_chaintable <rmnet0> <allow|deny>", false);
            return 0;
        }

        const char* white_list = argv[2];
        FirewallRule rule = parseRule(argv[3]);
        ALOGE("---snail_---------runCommand------del_browserwhitelist_chaintable-white_list===%s", argv[2]);
        int res = gCtls->firewallCtrl.delBrowserWhiteListChainTable(white_list, rule);
        return sendGenericOkFail(cli, res);
    }

app实现

@Override
public void setBrowserWhiteListEnable(boolean white_list_on,String white_list) throws RemoteException {
	// TODO Auto-generated method stub
	//String onnetfile = "/sdcard/.WhiteListNetList";
	//Utils.initWhiteListNetList(onnetfile);
	//List<String> list = Utils.readNetWhiteList(onnetfile);
	List<String> list = Utils.readNetWhiteListByProvider(RemoteService.this);
	String[] array = new String[list.size()];
	  // List转换成数组
    for (int i = 0; i < list.size(); i++) {
		      array[i] = list.get(i);
        TXLog.d(TAG, "----------setBrowserWhiteListEnable----------------array[i]=="+array[i]);
    }
	//Utils.writeNetWhiteList(onnetfile, Arrays.asList(white_list.split(",")));
    Utils.whiteNetWhiteListByProvider(RemoteService.this, Arrays.asList(white_list.split(",")));
	if(white_list_on){			Utils.delBrowserWhiteListChainTable(true, white_list);
			Utils.setBrowserWhiteListEnable(true, white_list);
			Settings.System.putInt(RemoteService.this.getApplicationContext().getContentResolver(),Settings.System.PRIZE_NET_WHITELIST_ON,1);
		}else {
			Utils.delBrowserWhiteListChainTable(true, white_list);
			Settings.System.putInt(RemoteService.this.getApplicationContext().getContentResolver(),Settings.System.PRIZE_NET_WHITELIST_ON,0);
		}
	}

@Override
public String[] getBrowserWhiteList() throws RemoteException {
	// TODO Auto-generated method stub
	//String onnetfile = "/sdcard/.WhiteListNetList";
	//Utils.initWhiteListNetList(onnetfile);
	//List<String> list = Utils.readNetWhiteList(onnetfile);
	int isopen = Settings.System.getInt(RemoteService.this.getApplicationContext().getContentResolver(),Settings.System.PRIZE_NET_WHITELIST_ON,0);
	if(isopen==0){
		TXLog.d(TAG, "----------getBrowserWhiteList-------return null--------");
		return null;
	}
	List<String> list = Utils.readNetWhiteListByProvider(RemoteService.this);
	String[] array = new String[list.size()];
		  // List转换成数组
		  for (int i = 0; i < list.size(); i++) {
		      array[i] = list.get(i);
		      TXLog.d(TAG, "----------getBrowserWhiteList----------------array[i]=="+array[i]);
		        
		  }
	return array;
}

@Override
public void addBrowserWhiteList(String addwhite) throws RemoteException {
	// TODO Auto-generated method stub
	//String onnetfile = "/sdcard/.WhiteListNetList";
	//Utils.initWhiteListNetList(onnetfile);
	//List<String> list = Utils.readNetWhiteList(onnetfile);
	List<String> list = Utils.readNetWhiteListByProvider(RemoteService.this);
	Utils.delBrowserWhiteListChainTable(true, addwhite);
	List<String> addlist = Arrays.asList(addwhite.split(","));
	for (int i = 0; i < addlist.size(); i++) {
		if(!list.contains(addlist.get(i))){
			list.add(addlist.get(i));
		}
	}
	StringBuilder csBuilder = new StringBuilder();
	  for(String weburl : list){
		  csBuilder.append(weburl);
		  csBuilder.append(",");
	  }
	  if(csBuilder.length()>1){
		  csBuilder.deleteCharAt(csBuilder.length()-1);
	  }
	  //Utils.writeNetWhiteList(onnetfile, Arrays.asList(csBuilder.toString().split(",")));
	  //List<String> newlist = Utils.readNetWhiteList(onnetfile);
	  Utils.whiteNetWhiteListByProvider(RemoteService.this, Arrays.asList(csBuilder.toString().split(",")));
	  Utils.setBrowserWhiteListEnable(true, csBuilder.toString());
	Settings.System.putInt(RemoteService.this.getApplicationContext().getContentResolver(),Settings.System.PRIZE_NET_WHITELIST_ON,1);
}
		
public static void whiteNetWhiteListByProvider(Context context, List<String> webnames){
    try {
	Uri uri = Uri.parse("content://com.prize.txInterface.provider/ip");
	context.getApplicationContext().getContentResolver().delete(uri,null,null);  
	 for (int i = 0; i < webnames.size(); i++) {
	String host = webnames.get(i);
	TXLog.d(TAG,"---------------whiteNetWhiteListByProvider------------host==="+host);
	if(!TextUtils.isEmpty(host)){
		Cursor cursor = context.getApplicationContext().getContentResolver().query(uri, null, "host = ?",new String[]{host}, null);  
		if(cursor != null){
	        	if(cursor.getCount()<=0){
				ContentValues values = new ContentValues();
				values.put("host", host);
				values.put("isActive", "true");
				TXLog.d(TAG,"---------------whiteNetWhiteListByProvider------------insert==="+host);
				context.getApplicationContext().getContentResolver().insert(uri, values);
			}
		}
	}
    }
} catch (Exception e) {
	// TODO: handle exception
	TXLog.d(TAG,"---------------whiteNetWhiteListByProvider------------"+e.getMessage());
	return ;
}
}
	
public static void delBrowserWhiteListChainTable(boolean white_list_on ,String white_list){
		INetworkManagementService netMgr = INetworkManagementService.Stub.asInterface(ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE));
		try {
			Log.e(TAG,"----delBrowserWhiteListChainTable-------------white_list=="+white_list);
			netMgr.delBrowserWhiteListChainTable(white_list,white_list_on);
		}  catch (Exception e) {
			Log.e(TAG,"----delBrowserWhiteListChainTable-----RemoteException----------e==="+e.getMessage());
			e.printStackTrace();
		} 
	}
	
public static void setBrowserWhiteListEnable(boolean white_list_on ,String white_list){
		INetworkManagementService netMgr = INetworkManagementService.Stub.asInterface(ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE));
		try {
			Log.e(TAG,"----setBrowserWhiteListEnable-------------white_list=="+white_list);
			netMgr.setBrowserWhiteListEnable(white_list,white_list_on);
		}  catch (Exception e) {
			Log.e(TAG,"----setBrowserWhiteListEnable-----RemoteException----------e==="+e.getMessage());
			e.printStackTrace();
		} 
	}
	

12)  APK安装白名单接口

---------frameworks/base/core/java/android/provider/Settings.java

 		/** @hide */
         public static final String PRIZE_INSTALL_WHITELIST_ON = "prize_install_whiteon";

------frameworks/base/packages/SettingsProvider/res/values/defaults.xml

 	<bool name="install_white_on">false</bool>

 ------frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

loadBooleanSetting(stmt, Settings.System.PRIZE_INSTALL_WHITELIST_ON, R.bool.install_white_on);
@Override
public void setApkWhiteListEnable(boolean iscaninstall, String whitelist)
		throws RemoteException {
	// TODO Auto-generated method stub
	//Utils.initWhiteListAppList(whitelist);
	//Utils.readInstallWhiteList(whitelist);
	//Utils.writeInstallWhiteList("/sdcard/.WhiteListAppList", Arrays.asList(whitelist.split(",")));
	Utils.readInstallWhiteListByProvider(RemoteService.this.getApplicationContext());
	Utils.whiteInstallWhiteListByProvider(RemoteService.this.getApplicationContext(),Arrays.asList(whitelist.split(",")));
	if(iscaninstall){
		Settings.System.putInt(RemoteService.this.getApplicationContext().getContentResolver(),Settings.System.PRIZE_INSTALL_WHITELIST_ON,1);
	}else {
		Settings.System.putInt(RemoteService.this.getApplicationContext().getContentResolver(),Settings.System.PRIZE_INSTALL_WHITELIST_ON,0);
	}
}

public static List<String> readInstallWhiteListByProvider(Context context){
	try {
		Uri uri = Uri.parse("content://com.prize.txInterface.provider/install");
		List<String> list = new ArrayList<String>();
		Cursor cursor = context.getApplicationContext().getContentResolver().query(uri, null, null,null, null);  
			
		if(cursor!=null&&cursor.moveToFirst()){
		      do{
		    	  String pkg  = cursor.getString(cursor.getColumnIndex("package"));
					TXLog.d(TAG,"---------------readInstallWhiteListByProvider------------pkg=="+pkg);
					if(!TextUtils.isEmpty(pkg)&& !list.contains(pkg)){
						list.add(pkg);
					}
			     }while(cursor.moveToNext());
		}
		return list;
	} catch (Exception e) {
		// TODO: handle exception
		TXLog.d(TAG,"---------------readInstallWhiteListByProvider------------"+e.getMessage());
		return null;
	}
}

public static void whiteInstallWhiteListByProvider(Context context, List<String> pkgnames){
	try {
		Uri uri = Uri.parse("content://com.prize.txInterface.provider/install");
		context.getApplicationContext().getContentResolver().delete(uri,null,null);  
	        for (int i = 0; i < pkgnames.size(); i++) {
			String pkg = pkgnames.get(i);
			TXLog.d(TAG,"---------------whiteInstallWhiteListByProvider------------pkg==="+pkg);
			if(!TextUtils.isEmpty(pkg)){
				Cursor cursor = context.getApplicationContext().getContentResolver().query(uri, null, "package = ?",new String[]{pkg}, null);  
				if(cursor != null){
					if(cursor.getCount()<=0){
						ContentValues values = new ContentValues();
						values.put("package", pkg);
						values.put("isActive", "true");
						TXLog.d(TAG,"---------------whiteInstallWhiteListByProvider------------insert==="+pkg);
						context.getApplicationContext().getContentResolver().insert(uri, values);
					}
				}
			}
		}
	} catch (Exception e) {
		// TODO: handle exception
		TXLog.d(TAG,"---------------whiteInstallWhiteListByProvider------------"+e.getMessage());
		return ;
	}
}

----- frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

private void installPackageLI(InstallArgs args, PackageInstalledInfo res){

 String pkgName = res.name = pkg.packageName;
 		Log.e("snail_", "---------installPackageLI---------------------pkgName=="+pkgName);
 		if ((installFlags & PackageManager.INSTALL_REPLACE_EXISTING) != 0){
         	Log.e("snail_", "---------installPackageLI----------INSTALL_REPLACE_EXISTING-------------");
         }
 		//boolean byprize  = false;
         //if ((installFlags & PackageManager.INSTALL_FROM_PRIZE) != 0){
         //	Log.e("snail_", "---------installPackageLI----------INSTALL_FROM_PRIZE-------------");
 		//	byprize = true;
         //}
         
         int iswhiteon = android.provider.Settings.System.getInt(mContext.getContentResolver(),android.provider.Settings.System.PRIZE_INSTALL_WHITELIST_ON,
                 0);
         Log.e("snail_", "---------installPackageLI----------------iswhiteon=="+iswhiteon);
         if(iswhiteon == 1){
         	//add for installer white list
             boolean caninstall =false;
             Log.e("snail_", "---------installPackageLI----------------pkgName=="+pkgName);
             if(!TextUtils.isEmpty(pkgName)){
 				if(isInstallerEnable(pkgName)/*|| byprize*/){
 					Log.e("snail_", "---------installPackageLI----------------caninstall = true------------");
 					caninstall = true;
 				}
 
 				if(!caninstall){
 					//Toast.makeText(mContext, R.string.install_error, Toast.LENGTH_LONG).show();
 					Log.e("snail_", "---------installPackageLI----------------caninstall = false------------");
 					//res.returnCode = PackageManager.INSTALL_FAILED_DUPLICATE_PERMISSION;
 					res.setError(PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE,
 						"app is not in the whitelist. packageName:" + pkgName);
 					return;
 				}
 			}
         }
		 
		 
     /*add for installer white list*/
     private boolean isInstallerEnable(String packagename){
        /* ArrayList<String> whiteListApp = new ArrayList<String>();
 
         try{
             BufferedReader br = new BufferedReader(new InputStreamReader(
             new FileInputStream("/sdcard/.WhiteListAppList")));
 
             String line ="";
             while ((line = br.readLine()) != null){
                 whiteListApp.add(line);
             }
 
             br.close();
         }catch(java.io.FileNotFoundException ex){
         	Log.e("snail_", "--------isInstallerEnable------FileNotFoundException=="+ex.getMessage());
             return false;
         }catch(java.io.IOException ex){
         	Log.e("snail_", "--------isInstallerEnable------IOException=="+ex.getMessage());
             return false;
         }
 
         Iterator<String> it = whiteListApp.iterator();
 
         while (it.hasNext()) {
             String whitelisItem = it.next();
             Log.e("snail_", "--------isInstallerEnable------whitelisItem=="+whitelisItem+"   packagename=="+packagename);
             if (whitelisItem.equals(packagename)) {
                 return true;
             }
         }
         return false;*/
 		try {
 			Uri uri = Uri.parse("content://com.prize.txInterface.provider/install");
 			//List<String> list = new ArrayList<String>();
 			Cursor cursor =  mContext.getApplicationContext().getContentResolver().query(uri, null, "package = ?",new String[]{packagename}, null);   
 			if(cursor != null && cursor.moveToFirst()){
 				Log.d(TAG,"---------readInstallWhiteListByProvider-------------exist==="+packagename);
 				return true;
 			}else {
 				Log.d(TAG,"---------readInstallWhiteListByProvider-------------!!!!!exist==="+packagename);
 			}
 			return false;
 		} catch (Exception e) {
 			// TODO: handle exception
 			Log.d("snail_","---------------readInstallWhiteListByProvider------------"+e.getMessage());
 			return false;
 		}
 		
     }

---------packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java

     private  boolean  readInstallWhiteListByProvider(Context context,String packagename){
 		try {
 			Uri uri = Uri.parse("content://com.prize.txInterface.provider/install");
 			List<String> list = new ArrayList<String>();
 			Cursor cursor = context.getApplicationContext().getContentResolver().query(uri, null, "package = ?",new String[]{packagename}, null);   
 			if(cursor != null && cursor.moveToFirst()){
 				Log.d(TAG,"---------readInstallWhiteListByProvider-------------exist==="+packagename);
 				return true;
 			}
 			return false;
 		} catch (Exception e) {
 			// TODO: handle exception
 			Log.d("snail_","---------------readInstallWhiteListByProvider------------"+e.getMessage());
 			return false;
 		}
 	}
          private String getInstallpkg(final Uri packageUri){
         final String getInstallscheme = packageUri.getScheme();
         final PackageUtil.AppSnippet as;
         PackageInfo  getInstallPkgInfo = null;
         Log.e("snail_", "-----onCreate-------getInstallpkg----------getInstallscheme=="+getInstallscheme);
         if(getInstallscheme.equals(SCHEME_PACKAGE)){
         	try {
         		getInstallPkgInfo = mPm.getPackageInfo(packageUri.getSchemeSpecificPart(),PackageManager.GET_PERMISSIONS| PackageManager.GET_UNINSTALLED_PACKAGES);
             } catch (NameNotFoundException e) {
             }
             if (getInstallPkgInfo != null) {
                 return getInstallPkgInfo.packageName;
             }else {
             	 Log.e("snail_", "-----onCreate-------getInstallpkg---SCHEME_PACKAGE----null------");
 			}
         }else if (getInstallscheme.equals(SCHEME_FILE)) {
         	File sourceFile = new File(packageUri.getPath());
             PackageParser.Package parsed = PackageUtil.getPackageInfo(sourceFile);
             // Check for parse errors
             if (parsed != null) {
             	getInstallPkgInfo = PackageParser.generatePackageInfo(parsed, null,PackageManager.GET_PERMISSIONS, 0, 0, null,new PackageUserState());
             	if (getInstallPkgInfo != null) {
                     return getInstallPkgInfo.packageName;
                 }else {
                 	 Log.e("snail_", "-----onCreate-------getInstallpkg---SCHEME_FILE----null------");
 				}
             }
             
 		}else if (getInstallscheme.equals(SCHEME_CONTENT)) {
 			 Uri baseUri = MediaStore.Files.getContentUri("external");
 			 Log.e("snail_","-----getInstallpkg--------------------SCHEME_CONTENT--------------baseUri=="+baseUri.toString());
 			 if(packageUri.toString().contains(baseUri.toString())){
 				    try {
 					    //int id = Integer.parseInt(packageUri.toString().replace(baseUri.toString()+File.separator, ""));
 				    	String id = packageUri.toString().replace(baseUri.toString()+File.separator, "");
 					    String pathString = getPkgPath(PackageInstallerActivity.this,id);
 					    Log.d("snail_", "--------getApkPackagesName---SCHEME_CONTENT--------pathString=="+pathString);
 					    if(!TextUtils.isEmpty(pathString)){
 					    	PackageManager pm = PackageInstallerActivity.this.getApplicationContext().getPackageManager();
 					        PackageInfo info = pm.getPackageArchiveInfo(pathString, PackageManager.GET_ACTIVITIES);
 					        ApplicationInfo appInfo = null;
 					        if (info != null) {
 					            appInfo = info.applicationInfo;
 					            String packageName = appInfo.packageName;
 					            Log.d("snail_", "--------getApkPackagesName--*****************---------packageName=="+packageName);
 					            return packageName;
 					        }
 					    }
 					} catch (NumberFormatException e) {
 						Log.e("snail_", "-----onCreate-------getInstallpkg---NumberFormatException------e=="+e.getMessage());
 					    e.printStackTrace();
 					}
 			 }
 		}
         return "";
     }
	 
public String getPkgPath(Context context,String  _id) {
         final String[] projection = {MediaColumns.DATA};
         final String where = MediaColumns._ID + " = ?";
         Uri baseUri = MediaStore.Files.getContentUri("external");
         
         Cursor c = null;
         String provider = "com.android.providers.media.MediaProvider";
         Uri itemUri = null;
         context.grantUriPermission(provider, baseUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
         Log.d("snail_", "getItemContentUri------- projection = "+projection+", where = "+where+ ", baseUri = "+baseUri);
         try {
             c = context.getContentResolver().query(baseUri,
                     projection,
                     where,
                     new String[]{_id},
                     null);
             if (c != null && c.moveToNext()) {
                 String path = c.getString(c.getColumnIndexOrThrow(MediaColumns.DATA));//DATA
                 if (!TextUtils.isEmpty(path)) {
                     Log.d("snail_", "getItemContentUri, path = " + path);
                     return path;
                 }
             }
         } catch (Exception e) {
         	Log.e(TAG, "getItemContentUri Exception", e);
         } finally {
             if (c != null) {
                 c.close();
             }
         }
         return "";
     }
	 
  private boolean judgeInstallwhite(String pkgName){
 		if (!TextUtils.isEmpty(pkgName)) {
 				Log.e("snail_", "-----judgeInstallwhite------------------------pkgName=="+ pkgName);
 				// add for installer enable/disable
 			if (!readInstallWhiteListByProvider(PackageInstallerActivity.this,pkgName)) {
 					Log.e("snail_","-----judgeInstallwhite-----------!!!!!!isInstallerEnable--------------");
 					 return false;
 			}
 		}
 		return true;
     }
	 
	 
	 
onCreate{

         Log.e("snail_", "-----onCreate----------------111----------packageUri=="+packageUri);
         int iswhiteon = android.provider.Settings.System.getInt(this.getContentResolver(),android.provider.Settings.System.PRIZE_INSTALL_WHITELIST_ON,0);
 		if (iswhiteon == 1) {
 			String pkgName = getInstallpkg(packageUri);
 			if (!TextUtils.isEmpty(pkgName)) {
 				Log.e("snail_","-----judgeInstallwhite------------------------pkgName=="+ pkgName);
 				// add for installer enable/disable
 				if (!judgeInstallwhite(pkgName)) {
 					Log.e("snail_","-----judgeInstallwhite-----------!!!!!!isInstallerEnable--------------");
 					this.overridePendingTransition(0, 0);
 					finish();
 		            return;
 				}
 			}
 		}

13)  应用卸载接口

详见  天芯教育需求接口实现(一)   应用静默安装

14)  护眼模式开关接口


public static void setBluesysEnable(final Context mContext,final boolean isOpen) {
		final boolean BLUELIGHT_MTK = true;
		AsyncTask.execute(new Runnable() {
			public void run() {
				final ContentResolver mResolver = mContext.getContentResolver();
				Settings.System.putIntForUser(mResolver,Settings.System.PRIZE_BLULIGHT_MODE_STATE, isOpen ? 0: 1, UserHandle.USER_CURRENT);
				int mBluLightTimeStatus = Settings.System.getIntForUser(mResolver, Settings.System.PRIZE_BLULIGHT_TIME_STATE,0, UserHandle.USER_CURRENT);
				int mBluLightTimingStatus = Settings.System.getIntForUser(mResolver, Settings.System.PRIZE_BLULIGHT_TIMING_STATE,0, UserHandle.USER_CURRENT);
				if (isOpen) {
					if (BLUELIGHT_MTK) {
						PictureQuality.enableBlueLight(false);
					} 
					if (mBluLightTimeStatus == 1) {
						Settings.System.putInt(mResolver, Settings.System.PRIZE_BLULIGHT_TIMING_STATE, 0);
						setBluLightTime(mContext,101010,Settings.System.PRIZE_BLULIGHT_START_TIME,"com.android.intent_action_open_blulight");
					}
				} else {
					if (BLUELIGHT_MTK) {
						PictureQuality.enableBlueLight(true);
					} 
					/* prize-modify for huyanmode-lihuangyuan-2017-06-09-end */
					if (mBluLightTimingStatus == 1) {
						setBluLightTime(mContext,101011,Settings.System.PRIZE_BLULIGHT_END_TIME,"com.android.intent_action_close_blulight");
						if(mBluLightTimingStatus == 0){
                            cancelAlarm(mContext,"com.android.intent_action_open_blulight");
                        }
					}
				}
			}
		});
	}
	private static void cancelAlarm(final Context mContext,String action){
        Intent intent = new Intent();
        intent.setAction(action);
        PendingIntent pi = PendingIntent.getBroadcast(mContext, 0,intent, 0);
        AlarmManager am = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
        am.cancel(pi);
    }
	private static void setBluLightTime(final Context mContext,int requestCode,String key, String action){
        TXLog.d(TAG,"--------setBluLightTime setBluLightTime() key = " + key);
        AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);

        Intent mIntent = new Intent(action);
        PendingIntent operation = PendingIntent.getBroadcast(mContext, requestCode /* requestCode */, mIntent, 0);

        long alarmTime = getAlarmTime(key).getTimeInMillis();

        alarmManager.setExact(AlarmManager.RTC_WAKEUP,alarmTime,operation);
    }
    public  static Calendar getAlarmTime(String key) {
        int[] mHourAndMinuteArr = parseBluLightTime(key);
        int hour = mHourAndMinuteArr[0];
        int minute = mHourAndMinuteArr[1];
        Log.d("BluLight","PrizeBluLightTileDefined getAlarmTime() key = " + key+",hour = "+hour+",minute = "+minute);

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());

        int mYear = calendar.get(Calendar.YEAR);
        int mMonth = calendar.get(Calendar.MONTH);
        int mDay = calendar.get(Calendar.DAY_OF_MONTH);

        Calendar mCalendar = Calendar.getInstance();
        mCalendar.set(Calendar.YEAR, mYear);
        mCalendar.set(Calendar.MONTH, mMonth);
        mCalendar.set(Calendar.DAY_OF_MONTH, mDay);
        mCalendar.set(Calendar.HOUR_OF_DAY, hour);
        mCalendar.set(Calendar.MINUTE, minute);
        mCalendar.set(Calendar.SECOND, 0);
        mCalendar.set(Calendar.MILLISECOND, 0);

        long mCurrentMillis = calendar.getTimeInMillis();
        long mTimerMillis = mCalendar.getTimeInMillis();

        boolean isTimerEarlyCurrent = mTimerMillis < mCurrentMillis;
        boolean isEndEarlyStart = false;
        if(Settings.System.PRIZE_BLULIGHT_END_TIME.equals(key)){
            int[] mStartHourAndMinuteArr = parseBluLightTime(Settings.System.PRIZE_BLULIGHT_START_TIME);
            int mStartHour = mStartHourAndMinuteArr[0];
            int mEndHour = mStartHourAndMinuteArr[1];
            Calendar mStartCalendar = Calendar.getInstance();
            mStartCalendar.set(Calendar.YEAR, mYear);
            mStartCalendar.set(Calendar.MONTH, mMonth);
            mStartCalendar.set(Calendar.DAY_OF_MONTH, mDay);
            mStartCalendar.set(Calendar.HOUR_OF_DAY, mStartHour);
            mStartCalendar.set(Calendar.MINUTE, mEndHour);
            mStartCalendar.set(Calendar.SECOND, 0);
            mStartCalendar.set(Calendar.MILLISECOND, 0);

            long mStartMillis = mStartCalendar.getTimeInMillis();
            isEndEarlyStart = mTimerMillis < mStartMillis;
        }
        if(isTimerEarlyCurrent || isEndEarlyStart){
            mCalendar.set(Calendar.DAY_OF_MONTH, mDay+1);
        }
        SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        String bgdate = dfs.format(mCalendar.getTime());
        Log.d("BluLight","PrizeBluLightTileDefined Time : "+bgdate);
        return mCalendar;
    }
    private static int[] parseBluLightTime(String key){
        String mBluLightTimeStatus = Settings.System.getString(mContext.getContentResolver(), key);
        int[] mHourAndMinuteArr = new int[2];
        if(mBluLightTimeStatus != null){
            String[] mTimeArr = mBluLightTimeStatus.split(":");
            for(int i=0;i<mTimeArr.length;i++){
                mHourAndMinuteArr[i] = Integer.parseInt(mTimeArr[i]);
            }
        }
        return mHourAndMinuteArr;
    }

15)  应用联网控制

public static void setAppFirewall(Context mContext,int uid, boolean enabled) {
		try {
			TXLog.d("PrizeNetControlsss", "setAppFirewall enabled:" + enabled+" uid=="+uid);
			getINetworkManagementService(mContext).setFirewallUidChainRule(uid, 0, enabled);
			getINetworkManagementService(mContext).setFirewallUidChainRule(uid, 1, enabled);
        } catch (RemoteException e) {
			e.printStackTrace();
		} catch (Exception e) {
			TXLog.d(TAG, "setAppFirewall exception");
		}
	}
	
public void setFirewallUidChainRule(int uid, int networkType, boolean allow) {
        //enforceSystemUid();
        final String MOBILE = "mobile";
        final String WIFI = "wifi";

        final String rule = allow ? "allow" : "deny";
        final String chain = (networkType == 1) ? WIFI : MOBILE;

        try {
            mConnector.execute("firewall", "set_uid_fw_rule", uid, chain, rule);
        } catch (NativeDaemonConnectorException e) {
            throw e.rethrowAsParcelableException();
        }
    }
//CommandListener.cpp
if (!strcmp(argv[1], "set_uid_fw_rule")) {
        if (argc != 5) {
            cli->sendMsg(ResponseCode::CommandSyntaxError,
                         "Usage: firewall set_uid_fw_rule <uid> <mobile|wifi> <allow|deny>",
                         false);
            return 0;
        }

        int uid = atoi(argv[2]);
        FirewallChinaRule chain = parseChain(argv[3]);
        FirewallRule rule = parseRule(argv[4]);

        int res = gCtls->firewallCtrl.setUidFwRule(uid, chain, rule);
        return sendGenericOkFail(cli, res);
    }

//FirewallController.cpp	
int FirewallController::setUidFwRule(int uid, FirewallChinaRule chain, FirewallRule rule) {
    char uidStr[16];
    int res = 0;
    const char* op;
    const char* fwChain;

    sprintf(uidStr, "%d", uid);

    if (rule == ALLOW) {
        op = "-I";
    } else {
        op = "-D";
    }

    if(chain == MOBILE) {
        fwChain = "mobile";
    }else{
        fwChain = "wifi";
    }

    if(chain == MOBILE) {
        if(rule == ALLOW)
            blacklistUsers.insert(uid);
        else
            blacklistUsers.erase(uid);
    }

    res |= execIptables(V4, op, fwChain, "-m", "owner", "--uid-owner", uidStr,
                "-j", "DROP", NULL);

    res |= execIptables(V6, op, fwChain, "-m", "owner", "--uid-owner", uidStr,
                "-j", "DROP", NULL);

    return res;
}

16)  启动ServiceActivity

public static void startAapplication(Context context,int type,String pkg_name,String class_name){
		Intent mIntent=new Intent();
		mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		mIntent.setComponent(new ComponentName(pkg_name, class_name));
		TXLog.d(TAG, "----------startAapplication-----type=="+type+"  pkg_name=="+pkg_name+"  class_name=="+class_name);
		if(type==1){//service
			context.getApplicationContext().startService(mIntent);
		}else if(type==2){//activity
			context.getApplicationContext().startActivity(mIntent);
		}
	}

17)  控制无障碍服务

package com.prize.txInterface.util;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import android.content.ComponentName;
import android.content.Context;
import android.provider.Settings;
import android.text.TextUtils.SimpleStringSplitter;


public class AccessibilityUtils {

	
	private static String TAG = "snail_AccessibilityUtils";
	/**
     * @return the set of enabled accessibility services. If there are not services
     * it returned the unmodifiable {@link Collections#emptySet()}.
     */
    public static Set<ComponentName> getEnabledServicesFromSettings(Context context) {
        final String enabledServicesSetting = Settings.Secure.getString(
                context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
        if (enabledServicesSetting == null) {
        	TXLog.d(TAG, "----getEnabledServicesFromSettings-------getEnabledServicesFromSettings--------");
            return Collections.emptySet();
        }
        TXLog.d(TAG, "----getEnabledServicesFromSettings-------getEnabledServicesFromSettings==="+enabledServicesSetting);
        final Set<ComponentName> enabledServices = new HashSet<ComponentName>();
        final SimpleStringSplitter colonSplitter = new SimpleStringSplitter(':');
        colonSplitter.setString(enabledServicesSetting);

        while (colonSplitter.hasNext()) {
            final String componentNameString = colonSplitter.next();
            TXLog.d(TAG, "----getEnabledServicesFromSettings-------componentNameString==="+componentNameString);
            final ComponentName enabledService = ComponentName.unflattenFromString(componentNameString);
            if (enabledService != null) {
                enabledServices.add(enabledService);
            }
        }

        return enabledServices;
    }

    
	public static  void turnOnAccesibilityService(Context context, Boolean isInsert,String pack_class_name) {
		Set<ComponentName> enabledServices = AccessibilityUtils.getEnabledServicesFromSettings(context);

		if (enabledServices == (Set<?>) Collections.emptySet()) {
			enabledServices = new HashSet<ComponentName>();
		}
		ComponentName toggledService = ComponentName.unflattenFromString(pack_class_name);
		TXLog.d(TAG, "---turnOnAccesibilityService-----------preferenceKey=="+pack_class_name+"  toggledService=="+toggledService.toString());
		boolean accessibilityEnabled = false;
		if(isInsert){
			if(!enabledServices.contains(toggledService)){
				enabledServices.add(toggledService);
				TXLog.d(TAG, "--------turnOnAccesibilityService----isInsert---!!!!!!contains---------");
			}else {
				TXLog.d(TAG, "--------turnOnAccesibilityService---isInsert----contains---------");
			}
		}else {
			if(!enabledServices.contains(toggledService)){
				TXLog.d(TAG, "--------turnOnAccesibilityService----!!isInsert---!!!!!!contains---------");
			}else {
				enabledServices.remove(toggledService);
				TXLog.d(TAG, "--------turnOnAccesibilityService---!!!isInsert----contains---------");
			}
		}
		accessibilityEnabled = true;
		StringBuilder enabledServicesBuilder = new StringBuilder();
		for (ComponentName enabledService : enabledServices) {
			enabledServicesBuilder.append(enabledService.flattenToString());
			enabledServicesBuilder.append(':');
		}
		final int enabledServicesBuilderLength = enabledServicesBuilder.length();
		if (enabledServicesBuilderLength > 0) {
			enabledServicesBuilder.deleteCharAt(enabledServicesBuilderLength - 1);
		}
		TXLog.d(TAG, "----turnOnAccesibilityService--------enabledServicesBuilder==="+ enabledServicesBuilder.toString());

		Settings.Secure.putString(context.getContentResolver(),Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,enabledServicesBuilder.toString());
		Settings.Secure.putInt(context.getContentResolver(),Settings.Secure.ACCESSIBILITY_ENABLED, accessibilityEnabled ? 1: 0);
	}
}

18)  控制设备管理器

@Override
public void controlDeviceManager(String pkg_receiver, boolean active)
		throws RemoteException {
	// TODO Auto-generated method stub
	ComponentName receive = ComponentName.unflattenFromString(pkg_receiver);
	if(active){
		DeviceAdminUtils.setActiveAdmin(RemoteService.this.getApplicationContext(), receive);
	}else{
		DeviceAdminUtils.removeActiveAdmin(RemoteService.this.getApplicationContext(), receive);
	}
}
package com.prize.txInterface.util;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParserException;
import android.app.ActivityManagerNative;
import android.os.RemoteCallback;
import android.widget.AppSecurityPermissions;
import android.app.Activity;
import android.app.admin.DeviceAdminInfo;
import android.app.admin.DeviceAdminReceiver;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.RemoteException;
import android.util.EventLog;
import android.util.Log;

public class DeviceAdminUtils {
	
	private static String TAG = "snail_DeviceAdminUtils";
	private static DevicePolicyManager mDPM;
	private static PackageManager mPackageManager;
	private static Handler mHandler;
	
	
	public static void removeActiveAdmin(final Context mContext,ComponentName mComponentName){
		final DeviceAdminInfo mDeviceAdmin;
		ActivityInfo ai;
        try {
            ai = getPackageManager(mContext).getReceiverInfo(mComponentName, PackageManager.GET_META_DATA);
        } catch (PackageManager.NameNotFoundException e) {
            Log.w(TAG, "-----removeActiveAdmin----Unable to retrieve device policy " + mComponentName, e);
            return;
        }
		try {
            ActivityManagerNative.getDefault().stopAppSwitches();
        } catch (RemoteException e) {
        }
		
		if (!getDevicePolicyManager(mContext).isAdminActive(mComponentName)) {
            List<ResolveInfo> avail = getPackageManager(mContext).queryBroadcastReceivers(
                    new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),
                    PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS);
            int count = avail == null ? 0 : avail.size();
            boolean found = false;
            for (int i=0; i<count; i++) {
                ResolveInfo ri = avail.get(i);
                if (ai.packageName.equals(ri.activityInfo.packageName)&& ai.name.equals(ri.activityInfo.name)) {
                    try {
                        // We didn't retrieve the meta data for all possible matches, so
                        // need to use the activity info of this specific one that was retrieved.
                        ri.activityInfo = ai;
                        DeviceAdminInfo dpi = new DeviceAdminInfo(mContext, ri);
                        found = true;
                    } catch (XmlPullParserException e) {
                        Log.w(TAG, "--removeActiveAdmin---Bad " + ri.activityInfo, e);
                    } catch (IOException e) {
                        Log.w(TAG, "--removeActiveAdmin---Bad " + ri.activityInfo, e);
                    }
                    break;
                }
            }
            if (!found) {
                Log.w(TAG, "--removeActiveAdmin---Request to add invalid device admin: " + mComponentName);
                return;
            }
        }

        ResolveInfo ri = new ResolveInfo();
        ri.activityInfo = ai;
        try {
            mDeviceAdmin = new DeviceAdminInfo(mContext, ri);
        } catch (XmlPullParserException e) {
            Log.w(TAG, "--removeActiveAdmin---Unable to retrieve device policy " + mComponentName, e);
            return;
        } catch (IOException e) {
            Log.w(TAG, "--removeActiveAdmin---Unable to retrieve device policy " + mComponentName, e);
            return;
        }
        getDevicePolicyManager(mContext).getRemoveWarning(mDeviceAdmin.getComponent(),new RemoteCallback(new RemoteCallback.OnResultListener() {
                    @Override
                    public void onResult(Bundle result) {
                        CharSequence msg = result != null
                                ? result.getCharSequence(DeviceAdminReceiver.EXTRA_DISABLE_WARNING): null;
                                continueRemoveAction(mContext,mDeviceAdmin,msg);
                    }
                }, getHandler(mContext)));
		
	    }
	public static void continueRemoveAction(Context mContext,DeviceAdminInfo mDeviceAdmin, CharSequence msg) {
	        if (msg == null) {
	            try {
	            	TXLog.d(TAG, "------------removeActiveAdmin----continueRemoveAction-----msg == null------------");
	                ActivityManagerNative.getDefault().resumeAppSwitches();
	            } catch (RemoteException e) {
	            }
	            getDevicePolicyManager(mContext).removeActiveAdmin(mDeviceAdmin.getComponent());
	        } else {
	            try {
	                // Continue preventing anything from coming in front.
	                ActivityManagerNative.getDefault().stopAppSwitches();
					ActivityManagerNative.getDefault().resumeAppSwitches();
	            } catch (RemoteException e) {
	            }
	            TXLog.d(TAG, "------------removeActiveAdmin----continueRemoveAction-----msg!!!!= null------------");
	            getDevicePolicyManager(mContext).removeActiveAdmin(mDeviceAdmin.getComponent());
	        }
	    }
	public static  void setActiveAdmin(Context mContext,ComponentName mComponentName){
		ActivityInfo ai;
		DeviceAdminInfo mDeviceAdmin;
		boolean mRefreshing;
        try {
            ai = getPackageManager(mContext).getReceiverInfo(mComponentName, PackageManager.GET_META_DATA);
        } catch (PackageManager.NameNotFoundException e) {
            TXLog.d(TAG, "--------setActiveAdmin-------Unable to retrieve device policy " + mComponentName+" Except=="+e.getMessage());
            return;
        }
        if (!getDevicePolicyManager(mContext).isAdminActive(mComponentName)) {
        	TXLog.d(TAG, "-------------!!!isAdminActive---------mComponentName=="+mComponentName);
            List<ResolveInfo> avail = getPackageManager(mContext).queryBroadcastReceivers(new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),
                    PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS);
            int count = avail == null ? 0 : avail.size();
            boolean found = false;
            for (int i=0; i<count; i++) {
                ResolveInfo ri = avail.get(i);
                if (ai.packageName.equals(ri.activityInfo.packageName)&& ai.name.equals(ri.activityInfo.name)) {
                    try {
                        // We didn't retrieve the meta data for all possible matches, so
                        // need to use the activity info of this specific one that was retrieved.
                        ri.activityInfo = ai;
                        DeviceAdminInfo dpi = new DeviceAdminInfo(mContext, ri);
                        found = true;
                    } catch (XmlPullParserException e) {
                    	TXLog.d(TAG, "----setActiveAdmin---Bad " + ri.activityInfo+"  Exception=="+ e.getMessage());
                    } catch (IOException e) {
                    	TXLog.d(TAG, "----setActiveAdmin---Bad " + ri.activityInfo+"  Exception=="+ e.getMessage());
                    }
                    break;
                }
            }
            if (!found) {
            	TXLog.d(TAG, "----setActiveAdmin---Request to add invalid device admin: " + mComponentName);
                return;
            }
        }else {
        	TXLog.d(TAG, "------------isAdminActive---------mComponentName=="+mComponentName);
		}
        ResolveInfo ri = new ResolveInfo();
        ri.activityInfo = ai;
        try {
            mDeviceAdmin = new DeviceAdminInfo(mContext, ri);
        } catch (XmlPullParserException e) {
        	TXLog.d(TAG, "----setActiveAdmin---Unable to retrieve device policy " + mComponentName+" Except=="+e.getMessage());
            return;
        } catch (IOException e) {
        	TXLog.d(TAG, "----setActiveAdmin---Unable to retrieve device policy " + mComponentName+" Except=="+e.getMessage());
            return;
        }
     // This admin already exists, an we have two options at this point.  If new policy
        // bits are set, show the user the new list.  If nothing has changed, simply return
        // "OK" immediately.
            mRefreshing = false;
            if (getDevicePolicyManager(mContext).isAdminActive(mComponentName)) {
                ArrayList<DeviceAdminInfo.PolicyInfo> newPolicies = mDeviceAdmin.getUsedPolicies();
                for (int i = 0; i < newPolicies.size(); i++) {
                    DeviceAdminInfo.PolicyInfo pi = newPolicies.get(i);
                    if (!getDevicePolicyManager(mContext).hasGrantedPolicy(mComponentName, pi.ident)) {
                        mRefreshing = true;
                        break;
                    }
                }
                if (!mRefreshing) {
                    // Nothing changed (or policies were removed) - return immediately
                    return;
                }
            }
        // If we're trying to add a profile owner and user setup hasn't completed yet, no
        // need to prompt for permission. Just add and finish.
       // if (!getDevicePolicyManager(mContext).hasUserSetupCompleted()) {
        	//TXLog.d(TAG, "------------isAdminActive---------!!!hasUserSetupCompleted-------");
        	try {
        		getDevicePolicyManager(mContext).setActiveAdmin(mDeviceAdmin.getComponent(), mRefreshing);
            } catch (RuntimeException e) {
                // Something bad happened...  could be that it was
                // already set, though.
            	TXLog.d(TAG, "----setActiveAdmin---Exception trying to activate admin getComponent=="+ mDeviceAdmin.getComponent()+"  except=="+e.getMessage());
            }
            return;
       // }else {
        //	TXLog.d(TAG, "------------isAdminActive---------hasUserSetupCompleted-------");
		//}
	}
	private static DevicePolicyManager  getDevicePolicyManager(Context mContext){
		if(mDPM == null){
			mDPM =  (DevicePolicyManager)mContext.getApplicationContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
		}
		return mDPM;
	}
	private  static PackageManager  getPackageManager(Context mContext){  
		if(mPackageManager == null){
			mPackageManager =  mContext.getApplicationContext().getPackageManager();
		}
		return mPackageManager;
	}
	private static Handler  getHandler(Context mContext){
		if(mHandler == null){
			mHandler = new Handler(mContext.getApplicationContext().getMainLooper());
		}
		return mHandler;
	}
}

19)  控制访问使用记录

@Override
	public void controlVisitList(String pkg_nm, boolean open)
		throws RemoteException {
	    // TODO Auto-generated method stub
	    PackageInfo mPackageInfo = UsageAccessUtils.getPackageInfo(RemoteService.this.getApplicationContext(), pkg_nm);
	    if(mPackageInfo != null){
		UsageAccessUtils.setUsageAccess(RemoteService.this.getApplicationContext(), open, mPackageInfo, pkg_nm);
	}
}

package com.prize.txInterface.util;

import android.app.AppOpsManager;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.UserHandle;
import android.util.Log;

import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.applications.ApplicationsState.AppEntry;
import com.prize.txInterface.application.TXApplication;



public class UsageAccessUtils {

	private static String TAG = "snail_UsageAccessUtils";
	private static AppOpsManager mAppOpsManager; 
	private static PackageManager mPm;
	
	public static  PackageInfo getPackageInfo(Context mContext,String mPackageName){
		PackageInfo mPackageInfo;
		ApplicationsState mState = ApplicationsState.getInstance(TXApplication.getInstance());
		ApplicationsState.AppEntry mAppEntry = mState.getEntry(mPackageName, UserHandle.myUserId());
        if (mAppEntry != null) {
            // Get application info again to refresh changed properties of application
            try {
                mPackageInfo = getPackageManager(mContext).getPackageInfo(mAppEntry.info.packageName,
                        PackageManager.GET_DISABLED_COMPONENTS |
                        PackageManager.GET_UNINSTALLED_PACKAGES |
                        PackageManager.GET_SIGNATURES);
                return mPackageInfo;
            } catch (NameNotFoundException e) {
                TXLog.d(TAG, "---getPackageInfo------- package==" + mAppEntry.info.packageName+"  except=="+e.getMessage());
            }  
        } else {
        	TXLog.d(TAG, "-getPackageInfo--Missing AppEntry; maybe reinstalli  ng?");
            mPackageInfo = null;
        }
		return null;
	};
	public static  void setUsageAccess(Context mContext,boolean newState,PackageInfo mPackageInfo,String mPackageName) {
		getAppOpsManager(mContext).setMode(AppOpsManager.OP_GET_USAGE_STATS, mPackageInfo.applicationInfo.uid,
                mPackageName, newState ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED);
    }
	
	public static  AppOpsManager getAppOpsManager(Context mContext){
		if(mAppOpsManager == null){
			mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
		}
		return mAppOpsManager;
	};
	public static  PackageManager getPackageManager(Context mContext){
		if(mPm == null){
			mPm = mContext.getPackageManager();
		}
		return mPm;
	};
}

20)  联系人白名单

 --packages/providers/BlockedNumberProvider/src/com/android/providers/blockednumber/BlockedNumberProvider.java 

//接收短信  接收来电

private boolean isBlocked(String phoneNumber) {
        if (TextUtils.isEmpty(phoneNumber)) {
            return false;
        }
		Log.d("snail_", "-----isBlocked------phoneNumber=="+phoneNumber);
		int contactwhiteliston = Settings.System.getInt(getContext().getContentResolver(),Settings.System.PRIZE_CONTACT_WHITELIST,0);
		Log.d("snail_", "-----isBlocked------contactwhiteliston=="+contactwhiteliston);
		if(contactwhiteliston == 1){
			Log.d("snail_", "-----isBlocked----contactwhiteliston == 1----phoneNumber=="+phoneNumber);
			String num = phoneNumber;
			if(num.startsWith("+86")){
				num = num.replaceFirst("+86","");
				Log.d("snail_", "-----isBlocked----contactwhiteliston == 1----num=="+num);
			}
			if(!isContactWhiteEnable(num)){
				Log.d("snail_", "-----isBlocked----!!!!isContactWhiteEnable----num=="+num);
				return true;
			}
		}else{
			Log.d("snail_","-----isBlocked----contactwhiteliston == 0----phoneNumber=="+phoneNumber);
		}
        final String inE164 = Utils.getE164Number(getContext(), phoneNumber, null); // may be empty.
//打电话

---packages/services/PrizeTelecomm/src/com/android/server/telecom/components/UserCallIntentProcessor.java

 if (Intent.ACTION_CALL.equals(action) ||
                 Intent.ACTION_CALL_PRIVILEGED.equals(action) ||
                 Intent.ACTION_CALL_EMERGENCY.equals(action)) {
             processOutgoingCallIntent(intent, callingPackageName, canCallNonEmergency);
         	Log.d("snail_", "--**************-------processOutgoingCallIntent------------num=="+PhoneNumberUtils.getNumberFromIntent(intent, mContext));
         	String number = PhoneNumberUtils.getNumberFromIntent(intent, mContext);
         	if(!TextUtils.isEmpty(number)){
          		int contactwhiteliston = Settings.System.getInt(mContext.getContentResolver(),Settings.System.PRIZE_CONTACT_WHITELIST,0);
          		Log.d("snail_", "---NewOutgoingCallIntentBroadcaster--------contactwhiteliston=="+contactwhiteliston);
          		if(contactwhiteliston == 1){
          			Log.d("snail_", "---NewOutgoingCallIntentBroadcaster------contactwhiteliston == 1----phoneNumber=="+number);
          			String num = number.replaceAll(" ", "");
          			if(num.startsWith("+86")){
          				num = num.replaceFirst("+86","");
          				Log.d("snail_", "-NewOutgoingCallIntentBroadcaster--------contactwhiteliston == 1----num=="+num);
          			}
          			if(!isContactWhiteEnable(num)){
          				Log.d("snail_", "--NewOutgoingCallIntentBroadcaster-------!!!!isContactWhiteEnable-OUTGOING_CANCELED---num=="+num);
          				return ;
          			}
          		}else{
          			Log.d("snail_","---OutgoingCallBroadcaster--isBlocked----contactwhiteliston == 0----phoneNumber=="+number);
          		}
             }
         	
         	processOutgoingCallIntent(intent, callingPackageName, canCallNonEmergency);

//发送短信

 

private void confirmSendMessageIfNeeded() {
     	 Log.d("snail_", "--------confirmSendMessageIfNeeded---------start---");
         if (isOmhSizeLimitDialog()) {
             return;
         }
         if (!isRecipientsEditorVisible()){
         	if(mConversation != null){
         		ContactList recipients = mConversation.getRecipients();
         		for (int i = 0; i < recipients.size(); i++) {
 					if(!TextUtils.isEmpty(recipients.get(i).getNumber())){
 						String num = MessageUtils.formatPhoneNumber(recipients.get(i).getNumber());
 						if (!MessageUtils.isInWhiteList(ComposeMessageActivity.this,num)) {
 						  showErrorDialog();
 		  	              Log.d("snail_", "---------!isRecipientsEditorVisible()-----stop-------num===="+num);
 		  	              return;
 		  				}
 					}
 				}
         	}
         }else{
 			if(!mRecipientsEditor.isInWhiteList(ComposeMessageActivity.this)){
 				 Log.d("snail_", "---------isRecipientsEditorVisible()-----stop-----");
 				showErrorDialog();
 				return;
 			}
 		}
		
private void showErrorDialog(){
 	   new AlertDialog.Builder(this)
        .setCancelable(false)
        .setIconAttribute(android.R.attr.alertDialogIcon)
        .setTitle(getResources().getString(R.string.strFail))
        .setMessage(R.string.invalid_recipient_message)
        .setNegativeButton(R.string.no, new CancelSendingListenerForInvalidRecipient())
        .setOnKeyListener(new DialogInterface.OnKeyListener() {
            @Override
            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
	
                    dialog.dismiss();
                }
                return false;
            }
        })
        .show();
        boolean requiresMms = mWorkingMessage.requiresMms();
        View sendButton = showSmsOrMmsSendButton(requiresMms);
        if (sendButton != null) {
            sendButton.setEnabled(false);
            sendButton.setFocusable(false);
        }
    }

悬浮窗
[全能分词开源](https://github.com/l465659833/Bigbang/)


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值