나는 쥘 분석에 동의, 그리고 콘크리트 정밀도 추가합니다 : APK를에 ACTION_VIEW에 의해 불려 PackageInstallerActivity
에서
, 이것은 onCreate()
방법이있다 :
315 String apkPath = mPackageURI.getPath();
316 File apkFile = new File(apkPath);
그리고 이전을 즉, PackageUtil
에서이 메소드가 호출된다
73 public static PackageParser.Package getPackageInfo(Uri packageURI) {
74 final String archiveFilePath = packageURI.getPath();
75 PackageParser packageParser = new PackageParser(archiveFilePath);
76 File sourceFile = new File(archiveFilePath);
77 DisplayMetrics metrics = new DisplayMetrics();
78 metrics.setToDefaults();
79 return packageParser.parsePackage(sourceFile, archiveFilePath, metrics, 0);
80 }
모든이가 패키지 매니저가 할 것을 확인하는 경향은 기대 우리스 파일.
로그는 packageParser.parsePackage
에 있으며, Uri에 지정된 경로가 파일인지 여부를 테스트합니다.
import java.io.*;
import android.content.*;
import android.database.*;
import android.net.*;
import android.os.*;
import android.preference.PreferenceManager;
import android.util.Log;
public class LocalFileContentProvider extends ContentProvider {
private static final String URI_PREFIX = "content://your.content.provider.as.per.manifest";
public static String constructUri(String url) {
Uri uri = Uri.parse(url);
return uri.isAbsolute() ? url : URI_PREFIX + url;
}
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(getContext());
boolean allowLocal = app_preferences.getBoolean("allowLocalFiles", false);
if (allowLocal) {
try {
File file = new File(uri.getPath());
if (file.isDirectory())
return null;
ParcelFileDescriptor parcel = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
return parcel;
} catch (Exception e) {
return null;
}
} else {
return null;
}
}
@Override
public boolean onCreate() {
return true;
}
@Override
public int delete(Uri uri, String s, String[] as) {
throw new UnsupportedOperationException("Not supported by this provider");
}
@Override
public String getType(Uri uri) {
throw new UnsupportedOperationException("Not supported by this provider");
}
@Override
public Uri insert(Uri uri, ContentValues contentvalues) {
throw new UnsupportedOperationException("Not supported by this provider");
}
@Override
public Cursor query(Uri uri, String[] as, String s, String[] as1, String s1) {
throw new UnsupportedOperationException("Not supported by this provider");
}
@Override
public int update(Uri uri, ContentValues contentvalues, String s, String[] as) {
throw new UnsupportedOperationException("Not supported by this provider");
}
}
내 매니페스트
<provider android:name="it.automated.android.kiosk.se.LocalFileContentProvider"
android:authorities="it.automated" />
를 포함) (당신이 나를에서 이동을하기 전에 사용자 환경 설정 선택 가능)
이 ContentProvider가 얼마나 특별하게 보이는지 (특히 openFile 구현)? – Selvin
@Selvin :'openFile()'구현을 가진'ContentProvider'는 파일을 제공하기 위해 필요한 것이고, [내가 일반적으로 잘 알고있는 기존의 간단한 구현] (https://github.com/)을 사용했습니다. commonsguy/cw-advandroid/tree/master/ContentProvider/Files)를 기반으로합니다. 내 질문은 누군가가 성공적으로이 작업을 얻었는지 여부입니다. 소스 코드를 읽는 것은'ContentProvider'가 어떻게 보이는지에 관계없이 지원되지 않는다고 제안합니다. – CommonsWare
아직 시도하지는 않았지만 여기에 설명 된 방법을 보았습니다. http://stackoverflow.com/a/4605040/377260 –