는 FileProvider
문제를 고려하고, 또한, 나는 ContentProvider
솔루션 가서는 치료를 작동합니다. 기본적으로 내부 캐시를 아무런 문제없이 사용할 수 있지만 공유하려는 임시 파일을 참조하는 데 사용할 수있는 URI가 타사 앱에도 제공됩니다. 내부 캐시를 사용하므로 불필요한 WRITE_EXTERNAL_STORAGE
요청할 수 없습니다.
추가 된 최대 캐시 크기 제한 (예 : checkSize()
에서 클래스 끝까지 모든 것을 삭제하여 클래스에서 제거 할 수 있습니다. 예를 들어, 공유 후 모든 파일을 직접 삭제할 수 있는지 장치에 남아 있지 않은 경우)는 각 호출시 누적 된 최대 크기를 확인하고 필요한 경우 캐시 절반을 지우고 (가장 오래된 파일 삭제) 작동합니다.새 파일 및
TemporaryFile.getPublicUri(file)
을 만들 때마다 당신이에 공개 열린 우리당을 얻을 원할 때마다 간단 할 수없는 그것을 사용
public class TemporaryFile extends ContentProvider {
private static final long MAX_SIZE = 512 * 1024;
// commented out on purpose so that you don't forget to rewrite it...
// public static final String AUTHORITY = "com.example.tempfile";
private UriMatcher uriMatcher;
@Override
public boolean onCreate() {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(AUTHORITY, "*", 1);
return true;
}
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
if (uriMatcher.match(uri) == 1) {
final String file = getContext().getCacheDir() + File.separator + uri.getLastPathSegment();
return ParcelFileDescriptor.open(new File(file), ParcelFileDescriptor.MODE_READ_ONLY);
}
else
throw new FileNotFoundException(uri.toString());
}
@Override
public int update (Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return 0;
}
@Override
public int delete (Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return null;
}
public static File getFile(Context context, String prefix, String extension) throws IOException {
checkSize(context);
File file = File.createTempFile(prefix, extension, context.getCacheDir());
file.setReadable(true);
file.deleteOnExit();
return file;
}
public static Uri getPublicUri(File file) {
return Uri.withAppendedPath(Uri.parse("content://" + AUTHORITY), file.getName());
}
public static void checkSize(Context context) throws IOException {
File dir = context.getCacheDir();
if (getDirSize(dir) > MAX_SIZE)
cleanDir(dir, MAX_SIZE/2);
}
private static long getDirSize(File dir) {
long size = 0;
for (File file : dir.listFiles())
if (file.isFile())
size += file.length();
return size;
}
private static void cleanDir(File dir, long atLeast) {
long deleted = 0;
File[] files = dir.listFiles();
Arrays.sort(files, new Comparator<File>() {
public int compare(File f1, File f2) {
return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
}
});
for (File file : files) {
deleted += file.length();
file.delete();
if (deleted >= atLeast)
break;
}
}
}
, 단지
File file = TemporaryFile.getFile(this, "prefix", ".extension");
전화 파일, 예. 데이터 또는 Intent.EXTRA_STREAM
이라는 의도로 전달합니다.
공급자 인, 필요한 매니페스트 항목을 추가하는 것을 잊지 마세요 중 하나
<provider
android:name=".TemporaryFile"
android:authorities="com.example.tempfile"
android:exported="true"
tools:ignore="ExportedContentProvider" >
</provider>
'destFile'의 가치는 무엇입니까? – CommonsWare
https://developer.android.com/reference/android/support/v4/content/FileProvider.html – Simon
@Simon을 살펴 보시고 테스트 해보고 결과를 게시하겠습니다. 이게 정확히 내가 필요로하는 것 같아! 그냥 메모, 이미지는 다른 많은 애플 리케이션을 위해 잘 작동합니다. 또한'destFile'에 대한 설명을 추가했습니다. –