Thay đổi cho Android 4.4 trở lên
Apps đang không được phép để ghi (xóa, sửa đổi ...) để bên ngoài lưu trữ trừ để họ gói cụ thể thư mục.
Như tài liệu Android nêu:
"Không được phép ghi ứng dụng vào các thiết bị lưu trữ ngoài thứ cấp, ngoại trừ trong các thư mục dành riêng cho gói của chúng như được cho phép bởi các quyền tổng hợp."
Tuy nhiên cách giải quyết khó chịu tồn tại (xem mã dưới đây) . Đã thử nghiệm trên Samsung Galaxy S4, nhưng cách khắc phục này không hoạt động trên tất cả các thiết bị. Ngoài ra, tôi sẽ không tin vào cách giải quyết này có sẵn trong các phiên bản Android trong tương lai .
Có một bài viết tuyệt vời giải thích (4.4+) thay đổi quyền lưu trữ bên ngoài .
Bạn có thể đọc thêm về cách giải quyết ở đây . Mã nguồn giải pháp là từ trang web này .
public class MediaFileFunctions
{
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static boolean deleteViaContentProvider(Context context, String fullname)
{
Uri uri=getFileUri(context,fullname);
if (uri==null)
{
return false;
}
try
{
ContentResolver resolver=context.getContentResolver();
// change type to image, otherwise nothing will be deleted
ContentValues contentValues = new ContentValues();
int media_type = 1;
contentValues.put("media_type", media_type);
resolver.update(uri, contentValues, null, null);
return resolver.delete(uri, null, null) > 0;
}
catch (Throwable e)
{
return false;
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private static Uri getFileUri(Context context, String fullname)
{
// Note: check outside this class whether the OS version is >= 11
Uri uri = null;
Cursor cursor = null;
ContentResolver contentResolver = null;
try
{
contentResolver=context.getContentResolver();
if (contentResolver == null)
return null;
uri=MediaStore.Files.getContentUri("external");
String[] projection = new String[2];
projection[0] = "_id";
projection[1] = "_data";
String selection = "_data = ? "; // this avoids SQL injection
String[] selectionParams = new String[1];
selectionParams[0] = fullname;
String sortOrder = "_id";
cursor=contentResolver.query(uri, projection, selection, selectionParams, sortOrder);
if (cursor!=null)
{
try
{
if (cursor.getCount() > 0) // file present!
{
cursor.moveToFirst();
int dataColumn=cursor.getColumnIndex("_data");
String s = cursor.getString(dataColumn);
if (!s.equals(fullname))
return null;
int idColumn = cursor.getColumnIndex("_id");
long id = cursor.getLong(idColumn);
uri= MediaStore.Files.getContentUri("external",id);
}
else // file isn't in the media database!
{
ContentValues contentValues=new ContentValues();
contentValues.put("_data",fullname);
uri = MediaStore.Files.getContentUri("external");
uri = contentResolver.insert(uri,contentValues);
}
}
catch (Throwable e)
{
uri = null;
}
finally
{
cursor.close();
}
}
}
catch (Throwable e)
{
uri=null;
}
return uri;
}
}