एंड्रॉइड 4.4+ के लिए बदलें
Apps का कर रहे हैं अनुमति नहीं करने के लिए लिखने (हटाने के लिए, संशोधित ...) के लिए बाहरी भंडारण को छोड़कर उनके लिए पैकेज विशेष निर्देशिका।
Android प्रलेखन राज्यों के रूप में:
"ऐप्स को माध्यमिक बाहरी संग्रहण उपकरणों को लिखने की अनुमति नहीं दी जानी चाहिए, सिवाय उनके पैकेज-विशिष्ट निर्देशिकाओं में सिवाय संश्लेषित अनुमतियों के।"
हालाँकि बुरा वर्कअराउंड मौजूद है (नीचे कोड देखें) । सैमसंग गैलेक्सी एस 4 पर परीक्षण किया गया है, लेकिन यह फिक्स सभी उपकरणों पर काम नहीं करता है। इसके अलावा, मैं एंड्रॉइड के भविष्य के संस्करणों में उपलब्ध होने वाले इस समाधान पर भरोसा नहीं करूंगा ।
बाह्य संग्रहण अनुमतियों में परिवर्तन (4.4+) की व्याख्या करने वाला एक शानदार लेख है ।
आप यहां वर्कअराउंड के बारे में अधिक पढ़ सकते हैं । समाधान स्रोत कोड इस साइट से है ।
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;
}
}