如何獲取其他app的資源
簡介
1.根據該app的pkgName建立context
2.根據context,資源標示符,和資源型別讀取資源。
詳細介紹
1.建立context
public static Context getContextFromPackageName(Context context, String packageName) {
if (packageName == null)
return null;
try {
Context slaveContext = context.createPackageContext(packageName, Context.CONTEXT_IGNORE_SECURITY);
return slaveContext;
} catch (Exception e) { }
return null;
}
使用到的flag除了<code> Context.CONTEXT_IGNORE_SECURITY </code>,還有
<code>Context.CONTEXT_INCLUDE_CODE </code>與<code>Context.CONTEXT_RESTRICTED </code>。
其中<code>Context.CONTEXT_RESTRICTED </code>將會返回一個有限制的context,它可能會禁用某些特定屬性。比如:一個與有限制的context想關聯的view可能會忽略特定的xml屬性。
而<code>Context.CONTEXT_INCLUDE_CODE </code>則會返回一個包含app程式碼的context。這意味可以載入程式碼到呼叫方的程式中去,從而使之可以通過getClassLoader()方法來初始化app的類。設定這個標誌位會強制應用安全限制到你訪問的app上去。如果被請求的app不能安全地載入到你的程式中去,則會丟擲java.lang.SecurityException。如果不設定這個標誌位,這個app可以被沒有任何限制地載入,但是在呼叫getClassLoader時始終只返回系統預設的classloader。(疑問:class loader都包含什麼?如何獲取呀)
<code>Context.CONTEXT_IGNORE_SECURITY </code>則會在請求context時忽略任何安全限制,始終允許它被載入。相較於使用<code>Context.CONTEXT_INCLUDE_CODE </code>,它並不是那麼安全。所以請小心使用。
2.載入res下的資源
public Drawable getResourcesFromApk(String resourceName,Context mApkContext) {
if (mApkContext == null || resourceName == null)
return null;
try {
Resources localResources = mApkContext.getPackageManager().getResourcesForApplication(mApkContext.getPackageName());
int resourceID = localResources.getIdentifier(mApkContext.getPackageName() + ":drawable/" + resourceName, null, null);
Drawable localDrawable = null;
if (resourceID != 0) {
localDrawable = localResources.getDrawable(resourceID);
return localDrawable;
}
return null;
} catch (Exception localNameNotFoundException) {
localNameNotFoundException.printStackTrace();
}
return null;
}
其他資源如int,color,colorStateList,string,以此類推。
獲取icon與app名稱
//這裡的context是對應app的context。
public static Drawable getAppIcon(Context context,String pkgName) {
PackageManager pm = context.getPackageManager();
try {
ApplicationInfo info = pm.getApplicationInfo(pkgName, 0);
return info.loadIcon(pm);//獲取app name呼叫loadLabel方法,但是返回結果可能為null
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
疑問
- 獲取到一個app的context之後,除了獲取資源還可以做什麼?
- 以上三個flag的應用場景和區別分別是什麼?
相關文章
- 如何獲取Mac/win軟體資源?Mac
- JVM 如何獲取當前容器的資源限制?JVM
- 好用的資源獲取網站網站
- 如何使用 urllib 包獲取網路資源
- iOS 8 3之後如何獲取App內的資料iOSAPP
- 異源資料同步 → 如何獲取 DataX 已同步資料量?
- Laravel_blade 呼叫其他路由_獲取資料;Laravel路由
- 利用XMLHTTP 從其他頁面獲取資料 (轉)XMLHTTP
- golang 介面按需獲取資源Golang
- 如何獲取想要的資料?
- Laravel 呼叫其他路由 獲取返回資料擴充套件Laravel路由套件
- 獲取遠端圖片的Blob資源
- Java - 獲取ClassPath的路徑和資源Java
- 【Android原始碼】資源載入AssetManager原始碼分析 app是如何載入資源以及我們是如何從記憶體中獲取Android原始碼APP記憶體
- Spring多資料來源獲取Spring
- ora-00054: 資源正忙, 但指定以 nowait 方式獲取資源如何解決AI
- 關於如何獲取資料的方法
- 【譯】React如何獲取資料React
- .在java和java web程式中的含義以及如何獲取web資源JavaWeb
- 介面測試的時候如何一鍵獲取 cookie, 並在其他介面引用?Cookie
- 獲取app 圖片APP
- 獲取v$latch資料來源實驗
- 如何呼叫API獲取你想要的資料API
- AngularJS中獲取資料來源的幾種方式AngularJS
- Android APP如何獲取裝置網線插拔的狀態AndroidAPP
- Android 通過名稱獲取資源IDAndroid
- 使用URLConnection物件獲取網路資源資訊物件
- 在ActionForm中如何獲取session中的資料?ORMSession
- 使用RxJava從多個資料來源獲取資料RxJava
- 在安卓 4.4.4 的機器上,獲取 app 冷熱啟動的資料無法獲取 WaitTime 資料安卓APPAI
- 教你如何使用API介面獲取資料!API
- electron + go 如何從sqlite獲取資料GoSQLite
- 如何獲取安全獲取蘋果udid,imei蘋果
- Swift高仿喜馬拉雅APP之一Charles抓包、圖片資源獲取等SwiftAPP
- 想獲取JS載入網頁的源網頁的原始碼,不想獲取JS載入後的資料JS網頁原始碼
- 第十七篇:獲取 / 修改程式資源限制
- C# 之 服務端獲取遠端資源C#服務端
- 如何在前臺獲取模型的關聯資料模型