Android:利用Java反射調用@hide的API__Java

來源:互聯網
上載者:User

設定使用3G資料功能:

從原始碼看到隱藏的API(ConnectivityManager.java):

 /**     * Sets the persisted value for enabling/disabling Mobile data.     *     * @param enabled Whether the mobile data connection should be     *            used or not.     * @hide     */    public void setMobileDataEnabled(boolean enabled) {        try {            mService.setMobileDataEnabled(enabled);        } catch (RemoteException e) {        }    }

通過java reflection功能來實現該功能,即調用
 mService.setMobileDataEnabled(enabled);

代碼如下:

private void EnableMobileData(boolean enable){ConnectivityManager connectivitymanager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);try{// Get mService// android.net.ConnectivityManager.mService;Field field = Class.forName(ConnectivityManager.class.getName()).getDeclaredField("mService");field.setAccessible(true);/*// 許可權修飾符int mo = field.getModifiers();String priv = Modifier.toString(mo);// 屬性類型Class<?> type = field.getType();Log.i(TAG, priv + " " + type.getName() + " " + field.getName()+ ";");            */// get Object of mServiceObject obj = field.get(connectivitymanager);// connectivitymanager.mService// get IConnectivityManager classClass myClass = Class.forName(obj.getClass().getName());Log.i(TAG, "class3:" + obj.getClass().getName());// IConnectivityManager// get android.net.IConnectivityManager// public void setMobileDataEnabled(boolean enabled) throws// android.os.RemoteException;Method method = myClass.getDeclaredMethod("setMobileDataEnabled",boolean.class);/*String pstr = "";Class<?>[] parameters = method.getParameterTypes();int count = parameters.length;Log.i(TAG, "count:" + count);if (count > 0){for (Class<?> p : parameters){pstr += p.getName() + ",";}pstr = pstr.substring(0, pstr.length() - 1);Log.i(TAG, "pstr:" + pstr);}Log.i(TAG, Modifier.toString(method.getModifiers()) + " "+ method.getReturnType().getName() + " " + method.getName()+ "(" + pstr + ");");*/method.setAccessible(true);method.invoke(obj, enable);}catch (Exception e){// TODO Auto-generated catch blocke.printStackTrace();}}

注意添加相應的permission:

   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />     <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />


補充一個網上利用java reflection解析APK軟體包資訊的代碼:

// Ref:http://blog.csdn.net/sodino/article/details/6215224// 利用反射機制調用android @hide的API進行解析public static void ExtractApkInfoExt(String apkPath, DownloadTask task){String PATH_PackageParser = "android.content.pm.PackageParser";String PATH_AssetManager = "android.content.res.AssetManager";try{// apk包的檔案路徑// 這是一個Package 解譯器, 是隱藏的// 建構函式的參數只有一個, apk檔案的路徑// PackageParser packageParser = new PackageParser(apkPath);Class pkgParserCls = Class.forName(PATH_PackageParser);Class[] typeArgs = new Class[1];typeArgs[0] = String.class;Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);Object[] valueArgs = new Object[1];valueArgs[0] = apkPath;Object pkgParser = pkgParserCt.newInstance(valueArgs);if (Constants.DEBUG_MODE)Log.d(TAG, "pkgParser:" + pkgParser.toString());// 這個是與顯示有關的, 裡面涉及到一些像素顯示等等, 我們使用預設的情況DisplayMetrics metrics = new DisplayMetrics();metrics.setToDefaults();// PackageParser.Package mPkgInfo = packageParser.parsePackage(new// File(apkPath), apkPath,// metrics, 0);typeArgs = new Class[4];typeArgs[0] = File.class;typeArgs[1] = String.class;typeArgs[2] = DisplayMetrics.class;typeArgs[3] = Integer.TYPE;Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod("parsePackage", typeArgs);valueArgs = new Object[4];valueArgs[0] = new File(apkPath);valueArgs[1] = apkPath;valueArgs[2] = metrics;valueArgs[3] = 0;Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser,valueArgs);if (pkgParserPkg == null){return;}// 應用程式資訊包, 這個公開的, 不過有些函數, 變數沒公開// ApplicationInfo info = mPkgInfo.applicationInfo;Field appInfoFld = pkgParserPkg.getClass().getDeclaredField("applicationInfo");ApplicationInfo info = (ApplicationInfo) appInfoFld.get(pkgParserPkg);// get VersionCodeField versionCodeFld = pkgParserPkg.getClass().getDeclaredField("mVersionCode");int versionCode = ((Integer) versionCodeFld.get(pkgParserPkg)).intValue();// get VersionNameField versionNameFld = pkgParserPkg.getClass().getDeclaredField("mVersionName");String versionName = (String) versionNameFld.get(pkgParserPkg);// uid 輸出為"-1",原因是未安裝,系統未分配其Uid。if (Constants.DEBUG_MODE)Log.d(TAG, "pkg:" + info.packageName + " uid=" + info.uid);// Resources pRes = getResources();// AssetManager assmgr = new AssetManager();// assmgr.addAssetPath(apkPath);// Resources res = new Resources(assmgr, pRes.getDisplayMetrics(),// pRes.getConfiguration());Class assetMagCls = Class.forName(PATH_AssetManager);Constructor assetMagCt = assetMagCls.getConstructor((Class[]) null);Object assetMag = assetMagCt.newInstance((Object[]) null);typeArgs = new Class[1];typeArgs[0] = String.class;Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod("addAssetPath", typeArgs);valueArgs = new Object[1];valueArgs[0] = apkPath;assetMag_addAssetPathMtd.invoke(assetMag, valueArgs);Resources res = mContext.getResources();typeArgs = new Class[3];typeArgs[0] = assetMag.getClass();typeArgs[1] = res.getDisplayMetrics().getClass();typeArgs[2] = res.getConfiguration().getClass();Constructor resCt = Resources.class.getConstructor(typeArgs);valueArgs = new Object[3];valueArgs[0] = assetMag;valueArgs[1] = res.getDisplayMetrics();valueArgs[2] = res.getConfiguration();res = (Resources) resCt.newInstance(valueArgs);CharSequence label = null;if (info.labelRes != 0){label = res.getText(info.labelRes);// if (label == null) {// label = (info.nonLocalizedLabel != null) ?// info.nonLocalizedLabel// : info.packageName;// }task.setTitle(String.valueOf(label));}if (Constants.DEBUG_MODE)Log.d(TAG, "label=" + label);// 這裡就是讀取一個apk程式的表徵圖if (info.icon != 0){Drawable icon = res.getDrawable(info.icon);task.setIcon(((BitmapDrawable) icon).getBitmap());// ImageView image = (ImageView) findViewById(R.id.appicon);// image.setVisibility(View.VISIBLE);// image.setImageDrawable(icon);}if (versionName != null){task.setVersionName(versionName);}task.setVersionCode(versionCode);task.setPackageName(info.packageName);if (info.processName == null){info.processName = info.packageName;}task.setProcessName(info.processName);}catch (Exception e){e.printStackTrace();}}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.