Android獲取其他應(yīng)用中的assets資源
最近有這樣一個需求:A應(yīng)用在一定條件下出發(fā)某個邏輯后,需要從B應(yīng)用中獲取一些資源(assets下的mp4視頻、還有drawable下的一些圖片用作背景),具體需求就不說啦哈哈,用一張圖來表示應(yīng)該更明白:
A和B應(yīng)用其實是1對多的關(guān)系,不同的B應(yīng)用需要從他們自己的地方獲取到資源給A。
一般我們獲取app內(nèi)的資源肯定是要獲取到Resource這個類,而Resource是通過Context類的getResource獲取到了,所以我們只需要獲取到B應(yīng)用的Context類就可以了。
可是其他App的Context怎么獲取?其實Context 自己就有構(gòu)建Context的方法:createPackageContext。
@Override public Context createPackageContext(String packageName, int flags) throws PackageManager.NameNotFoundException { return mBase.createPackageContext(packageName, flags); }
通過我們只需要傳入所需要App的包名,就可以構(gòu)造出對應(yīng)App的Context。第二個參數(shù)是一個配置標(biāo)記。
public static final int CONTEXT_INCLUDE_CODE = 0x00000001; public static final int CONTEXT_IGNORE_SECURITY = 0x00000002;
第一個標(biāo)記是讓我們可以通過類加載器去構(gòu)建相關(guān)類,但是需要第二個參數(shù)的配合:忽略安全限制。一般Flag就配置這樣個類型。
在創(chuàng)建出Context之后,就可以通過獲取Resource類去獲取對應(yīng)的資源了。
//栗子:獲取一個drawable 的id int identifier = bContext.getResources().getIdentifier("bg", "drawable", bContext.getPackageName());
但是assets中的資源就沒有這么方便了。雖然通過context可以獲取到對應(yīng)的assetsManager,但是在操作assetsManager獲取資源的時候就出現(xiàn)問題了:在assets中獲取資源一般都是通過文件或者流的方式,但是我在操作的時候直接拋出異常,說找不到我的資源名字。我這里檢查了好幾遍了,就是獲取不到。。。
那么這種情況下我想能不能通過反射去拿到我想需要的資源呢?
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.e("GFZY", "onCreate: "); try { Context bContext = this.createPackageContext("pers.jibai.matrixtext" , Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); ClassLoader loader = bContext.getClassLoader(); Class<?> clazz = loader.loadClass("pers.jibai.matrixtext.A"); Object a = clazz.getConstructor().newInstance(); Method getAssetBg = clazz.getMethod("getBgMp4", Context.class); Log.e("GFZY", "onCreate: " + getAssetBg.getName()); InputStream invoke = (InputStream) getAssetBg.invoke(a, bContext); BufferedReader reader = new BufferedReader(new InputStreamReader(invoke)); String s = reader.readLine(); reader.close(); ((TextView) findViewById(R.id.t)).setText(s); } catch (Exception e) { e.printStackTrace(); Log.e("GFZY", "onCreate: " + e.getMessage()); } }
這是我的A應(yīng)用
public class A { public void asd() { Log.e("GFZY", "asd:我是matrix "); } public InputStream getBgMp4(Context context) { try { return context.getAssets().open("asd"); } catch (IOException e) { e.printStackTrace(); } return null; } }
這是B應(yīng)用,我在B應(yīng)用中實現(xiàn)了一個方法,去獲取A中所需要的資源,然后通過反射調(diào)用這個方法,這種方式就可以拿到我想要的資源了,而且這種方法目前發(fā)現(xiàn)是萬能方法哈哈。
具體的例子和實現(xiàn)就不拷貝了,其實思路很簡單,就是兩步:構(gòu)建Context和反射調(diào)用。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
Android使用WebView實現(xiàn)截圖分享功能
這篇文章主要為大家詳細(xì)介紹了Android使用WebView實現(xiàn)截圖分享功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05android 把float轉(zhuǎn)換成Int的實例講解
今天小編就為大家分享一篇android 把float轉(zhuǎn)換成Int的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07Android WebView自定義長按選擇實現(xiàn)收藏/分享選中文本功能
這篇文章主要介紹了Android WebView自定義長按選擇實現(xiàn)收藏/分享選中文本功能,需要的朋友可以參考下2017-06-06Flutter 使用fluro的轉(zhuǎn)場動畫進(jìn)行頁面切換
在實際應(yīng)用中,我們常常會對不同的頁面采取不同的轉(zhuǎn)場動畫,以提高頁面切換過程中的用戶體驗。例如,微信的掃碼后在手機(jī)上確認(rèn)登錄頁面就是從底部彈出的,而大部分頁面的跳轉(zhuǎn)都是從右向左滑入。通過這種形式區(qū)分不同的轉(zhuǎn)場場景,從而給用戶更多的趣味性以提高用戶體驗。2021-06-06ViewPager+RadioGroup實現(xiàn)左右滑動卡片布局
這篇文章主要為大家詳細(xì)介紹了ViewPager+RadioGroup實現(xiàn)左右滑動卡片布局,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02Android實現(xiàn)WIFI和GPRS網(wǎng)絡(luò)的切換
這篇文章主要介紹了Android實現(xiàn)WIFI和GPRS網(wǎng)絡(luò)的切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11發(fā)布?Android?library?到?Maven?解析
這篇文章主要介紹了發(fā)布?Android?library到Maven解析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09