Android 다른 응용 프로그램의 assets 자원 가 져 오기
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 구축 과 반사 호출 이다.
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.더 많은 내용 을 알 고 싶다 면 아래 링크 를 보 세 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebpackNative, 자산 파이프라인 및 Webpackgem의 대체왜 나는 웹 패키지와 자산 파이프라인을 좋아하지 않는가 속도가 매우 느리기 때문에 나는 오랜 시간을 기다려야만 나의 자바스크립트가 컴파일되는 것을 볼 수 있다. 이것은 내가 웹 패키지를 사용하는 것을 좋아하지 않는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.