如何确保所有Android设备的文件都保存在图库中?

时间:2016-03-17 18:44:43

标签: android

根据用户评论,我的应用程序没有保存在手机上(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);
                    }
                });

    }

1 个答案:

答案 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;用于记录我在应用程序中处理但仍想知道的这些异常的选项。但是,有大量的崩溃报告服务,可能其中一些提供了相同的功能。