根据用户评论,我的应用程序没有保存在手机上(LG4,oneplus手机,Android 5.1,Android 6.0)
对于Android 6.0,我通过使用新的权限系统解决了这个问题。 但是,如何确保代码在所有设备上实际上100%正常工作? 有什么改进可以吗?
当用户单击“保存”按钮时,这是运行的onClick方法 但也要求获得Android 6设备的许可
public void saveQuote(View v) {
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
//check if we have permissoin to WRITE_EXTERNAL_STORAGE
if (PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
//This method just create a bitmap of my edittext
saveBitmap();
} else {
//if permission is not granted, then we ask for it
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_WRITE_EXTERNAL_STORAGE);
}
}
}
这是进行保存操作的代码:
private void saveImageToExternalStorage(Bitmap finalBitmap) {
String filename = "#" + pref_fileID.getInt(SAVE_ID, 0) + " Quote.JPEG";
//The directory in the gallery where the bitmaps are saved
File myDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString() + "/QuoteCreator");
//The directory in the gallery where the bitmaps are saved
File myDir = new File(root + "/QuoteCreator");
//creates the directory myDir.
myDir.mkdirs();
File file = new File(myDir, filename);
try {
FileOutputStream out = new FileOutputStream(file);
finalBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
Toast.makeText(getApplicationContext(), R.string.savedToast, Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
/*
Tell the media scanner about the new file so that it is
immediately available to the user.
*/
MediaScannerConnection.scanFile(this, new String[]{file.toString()}, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
}
答案 0 :(得分:0)
替换:
//The directory in the gallery where the bitmaps are saved
File myDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString() + "/QuoteCreator");
//The directory in the gallery where the bitmaps are saved
File myDir = new File(root + "/QuoteCreator");
使用:
File root=
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File myDir=new File(root, "QuoteCreator");
(注意:没有/
,没有toString()
,没有+
)
这可确保File
可以处理root
已经或没有尾随/
的情况。
替换:
out.flush();
out.close();
使用:
out.flush();
out.getFD().sync();
out.close();
这可以确保在继续之前将所有字节写入磁盘,特别是在将文件编入MediaStore
索引之前。
并替换:
e.printStackTrace();
在生产中对你有用的东西。此语句将某些内容记录到LogCat。它甚至不是向LogCat记录内容的首选方式(使用android.util.Log
上的方法,如e()
)。虽然您可以在开发计算机上看到LogCat用于您自己的设备和模拟器,但您无法在用户设备上看到LogCat。您缺少这些例外中的有用信息。就个人而言,我使用ACRA及其“无声异常”#34;用于记录我在应用程序中处理但仍想知道的这些异常的选项。但是,有大量的崩溃报告服务,可能其中一些提供了相同的功能。