Android 4.4 Kitkat'tan sonra ve 2017 itibariyle Android 4.4 ve daha düşük olanların payı yaklaşık% 20 ve azalıyor, File
sınıf ve getExternalStorageDirectory()
yöntem kullanarak SD karta kaydetmek mümkün değil . Bu yöntem, cihazınızın dahili belleğini döndürür ve görüntüler her uygulama tarafından görülebilir. Ayrıca görüntüleri yalnızca uygulamanıza özel olarak kaydedebilir ve kullanıcı uygulamanızı openFileOutput()
yöntemle sildiğinde silinir .
Android 6.0 ile başlayarak, SD kartınızı dahili bir bellek olarak biçimlendirebilirsiniz, ancak yalnızca cihazınıza özel olarak biçimlendirebilirsiniz. (SD arabayı dahili bellek olarak biçimlendirirseniz, yalnızca cihazınız içeriğine erişebilir veya içeriğini görebilir) Bu SD karta kaydedebilirsiniz diğer cevaplar, ancak çıkarılabilir bir SD kart kullanmak istiyorsanız aşağıdaki cevabımı okumalısınız.
Klasör kullanıcı tarafından seçilen klasörü almak için klasör yöntemine uri almak için Depolama Erişimi Çerçevesi'ni kullanmalı onActivityResult
ve kullanıcı aygıtı yeniden başlattıktan sonra klasöre erişebilmek için kalıcı izin izni eklemelisiniz.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
// selectDirectory() invoked
if (requestCode == REQUEST_FOLDER_ACCESS) {
if (data.getData() != null) {
Uri treeUri = data.getData();
tvSAF.setText("Dir: " + data.getData().toString());
currentFolder = treeUri.toString();
saveCurrentFolderToPrefs();
// grantUriPermission(getPackageName(), treeUri,
// Intent.FLAG_GRANT_READ_URI_PERMISSION |
// Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
final int takeFlags = data.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Check for the freshest data.
getContentResolver().takePersistableUriPermission(treeUri, takeFlags);
}
}
}
}
Şimdi, her görüntü kaydetmek istediğinizde kullanıcıdan klasör seçmesini istememek için kaydetme klasörünü paylaşılan tercihlere kaydedin.
Sen kullanmalıdır DocumentFile
görüntünüzü değil, kurtarmak için sınıf File
veya ParcelFileDescriptor
kontrol edebilirsiniz daha fazla bilgi için, bu konu ile SD karta görüntü kaydetmek için compress(CompressFormat.JPEG, 100, out);
yöntem ve DocumentFile
sınıflar.
mImage.setImageBitmap(_result.getBitmap());
benim deonTaskComplete()
callback'inde. Artık kullanıcıların uzun basın bağlam menüsü aracılığıyla dosyayı yerel olarak kaydetmelerine izin vermem gerekiyor. Aşağıdaki çözümü kullanabilmeliyim. Ne bilmek istiyorum, buna daha iyi bir yaklaşım buldunuz mu?