国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android獲取其他應(yīng)用中的assets資源

2019-10-21 21:30:17
字體:
供稿:網(wǎng)友

最近有這樣一個(gè)需求:A應(yīng)用在一定條件下出發(fā)某個(gè)邏輯后,需要從B應(yīng)用中獲取一些資源(assets下的mp4視頻、還有drawable下的一些圖片用作背景),具體需求就不說啦哈哈,用一張圖來表示應(yīng)該更明白:

Android,assets,資源

A和B應(yīng)用其實(shí)是1對(duì)多的關(guān)系,不同的B應(yīng)用需要從他們自己的地方獲取到資源給A。

一般我們獲取app內(nèi)的資源肯定是要獲取到Resource這個(gè)類,而Resource是通過Context類的getResource獲取到了,所以我們只需要獲取到B應(yīng)用的Context類就可以了。

可是其他App的Context怎么獲取?其實(shí)Context 自己就有構(gòu)建Context的方法:createPackageContext。

  @Override  public Context createPackageContext(String packageName, int flags)    throws PackageManager.NameNotFoundException {    return mBase.createPackageContext(packageName, flags);  }

通過我們只需要傳入所需要App的包名,就可以構(gòu)造出對(duì)應(yīng)App的Context。第二個(gè)參數(shù)是一個(gè)配置標(biāo)記。

public static final int CONTEXT_INCLUDE_CODE = 0x00000001;public static final int CONTEXT_IGNORE_SECURITY = 0x00000002;

第一個(gè)標(biāo)記是讓我們可以通過類加載器去構(gòu)建相關(guān)類,但是需要第二個(gè)參數(shù)的配合:忽略安全限制。一般Flag就配置這樣個(gè)類型。

在創(chuàng)建出Context之后,就可以通過獲取Resource類去獲取對(duì)應(yīng)的資源了。

//栗子:獲取一個(gè)drawable 的id      int identifier = bContext.getResources().getIdentifier("bg", "drawable", bContext.getPackageName());

但是assets中的資源就沒有這么方便了。雖然通過context可以獲取到對(duì)應(yīng)的assetsManager,但是在操作assetsManager獲取資源的時(shí)候就出現(xiàn)問題了:在assets中獲取資源一般都是通過文件或者流的方式,但是我在操作的時(shí)候直接拋出異常,說找不到我的資源名字。我這里檢查了好幾遍了,就是獲取不到。。。

那么這種情況下我想能不能通過反射去拿到我想需要的資源呢?

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)用中實(shí)現(xiàn)了一個(gè)方法,去獲取A中所需要的資源,然后通過反射調(diào)用這個(gè)方法,這種方式就可以拿到我想要的資源了,而且這種方法目前發(fā)現(xiàn)是萬能方法哈哈。

具體的例子和實(shí)現(xiàn)就不拷貝了,其實(shí)思路很簡單,就是兩步:構(gòu)建Context和反射調(diào)用。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 昌图县| 汉沽区| 高密市| 隆回县| 洛扎县| 阿尔山市| 贡嘎县| 北流市| 玉树县| 湖北省| 涡阳县| 镇雄县| 邳州市| 固始县| 电白县| 浦北县| 山东| 皮山县| 东方市| 福清市| 五寨县| 白银市| 仁怀市| 梅州市| 长子县| 吉隆县| 丹凤县| 同心县| 兰溪市| 江安县| 岢岚县| 昭苏县| 庆城县| 大城县| 固阳县| 万州区| 运城市| 始兴县| 自治县| 贵阳市| 肇庆市|