Android 다른 응용 프로그램의 assets 자원 가 져 오기

3875 단어 assetsandroid
최근 에 이런 수요 가 있 습 니 다.A 응용 은 일정한 조건 에서 특정한 논 리 를 출발 한 후에 B 응용 에서 자원(assets 에서 mp4 영상,그리고 drawable 에서 일부 그림 을 배경 으로 사용)을 얻어 야 합 니 다.구체 적 인 수 요 는 말 하지 않 겠 습 니 다.하하,한 장의 그림 으로 더 잘 알 아야 합 니 다.

A 와 B 응용 은 사실 1 쌍 이 넘 는 관계 이 고 서로 다른 B 응용 은 그들 자신의 곳 에서 자원 을 얻어 A 에 게 주어 야 한다.
일반적으로 우리 가 app 안의 자원 을 가 져 오 는 것 은 리 소스 라 는 종 류 를 가 져 오 는 것 이 고 리 소스 는 Context 류 의 getResource 를 통 해 얻 을 수 있 기 때문에 우 리 는 B 응용 Context 류 만 가 져 오 면 됩 니 다.
그런데 다른 App 의 Context 는 어떻게 가 져 옵 니까?사실 Context 자체 에 Context 를 구축 하 는 방법 이 있 습 니 다:createPackage Context.

  @Override
  public Context createPackageContext(String packageName, int flags)
    throws PackageManager.NameNotFoundException {
    return mBase.createPackageContext(packageName, flags);
  }
우 리 를 통 해 필요 한 앱 의 패키지 이름 만 입력 하면 해당 앱 의 Context 를 구성 할 수 있 습 니 다.두 번 째 매개 변 수 는 설정 표시 입 니 다.

public static final int CONTEXT_INCLUDE_CODE = 0x00000001;
public static final int CONTEXT_IGNORE_SECURITY = 0x00000002;
첫 번 째 표 시 는 클래스 로 더 를 통 해 관련 클래스 를 구축 할 수 있 지만 두 번 째 매개 변수의 협조 가 필요 합 니 다.안전 제한 을 무시 합 니 다.보통 Flag 은 이런 유형 을 설정 합 니 다.
Context 를 만 든 후에 리 소스 류 를 가 져 와 서 해당 하 는 자원 을 가 져 올 수 있 습 니 다.

//  :    drawable  id
      int identifier = bContext.getResources().getIdentifier("bg", "drawable", bContext.getPackageName());
하지만 assets 의 자원 은 이렇게 편리 하지 않다.context 를 통 해 해당 하 는 assets Manager 를 얻 을 수 있 지만 assets Manager 를 조작 하여 자원 을 얻 을 때 문제 가 발생 했 습 니 다.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 앱 입 니 다.

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 응용 입 니 다.저 는 B 응용 에서 하나의 방법 을 실 현 했 습 니 다.A 에 필요 한 자원 을 얻 은 다음 에 이 방법 을 반사 적 으로 호출 하면 제 가 원 하 는 자원 을 얻 을 수 있 습 니 다.그리고 이런 방법 은 현재 만능 방법 이라는 것 을 알 게 되 었 습 니 다.하하.
구체 적 인 예 와 실현 은 복사 하지 않 는 다.사실은 사고방식 이 매우 간단 하 다.바로 두 단계 이다.바로 Context 구축 과 반사 호출 이다.
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.더 많은 내용 을 알 고 싶다 면 아래 링크 를 보 세 요.

좋은 웹페이지 즐겨찾기