android marshmallow在sdcard上写公共文件

时间:2017-07-06 12:34:09

标签: android android-6.0-marshmallow android-sdcard

我想将一些文件保存在SDCard Documents文件夹的子文件夹中。我看了很多帖子,最后我没有任何异常,似乎文件存储很好,但是当我将手机连接到comp时,我仍然看不到文件夹,也没有文件。

修改

这只发生在设备上,在模拟器上,文件已创建

我已在清单文件中授予权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

我已经要求用户提供写入权限,并且已获得批准。这个帖子 This post helped me in granting permission

这是我的代码

    if (!Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)) {
        Toast.makeText(_ctx, "There is no external storage", Toast.LENGTH_LONG).show();
    } else {
        File docfolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
        docfolder.mkdirs();
        if (!docfolder.exists()) {
            Toast.makeText(_ctx, "Documents doesn't exist", Toast.LENGTH_LONG).show();
        }
        File folder = new File(docfolder, foldername);
        folder.mkdirs(); //make if not exist

        boolean isPresent = folder.exists();
        if (isPresent) {
            File file = new File(folder.getAbsolutePath(), filename);

            try {
                OutputStream os = new FileOutputStream(file);
                os.write(xml.getBytes());
                os.close();
            } catch (IOException e) {
                Toast.makeText(_ctx, e.toString(), Toast.LENGTH_LONG).show();

                Log.w("ExternalStorage", "Error writing " + file, e);
            }
            catch (Exception e) {
                Toast.makeText(_ctx, e.toString(), Toast.LENGTH_LONG).show();

                Log.w("ExternalStorage", "Error writing 2 " + file, e);
            }
        } else {
            Toast.makeText(_ctx, "cannot make directory " + foldername, Toast.LENGTH_LONG).show();
            Log.w("ExternalStorage", "cannot make directory " + foldername);
        }

欢迎任何提示!

修改

也许问题可能是这段代码将文件保存到该路径中?

/storage/emulated/0/Documents/IBHTrack/ibhTrack_GPX_20170706153858.xml

然而,因为我使用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)方法,我不知道如何获得真正的SDCard路径

1 个答案:

答案 0 :(得分:0)

首先检查权限:

 void checkPermission(Activity thisActivity){
        // Here, thisActivity is the current activity
        if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                // Show an explanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.
                Toast.makeText(MainActivity.this,"Permission denied, now log will not write in storage.",Toast.LENGTH_SHORT).show();

            } else {
                // No explanation needed, we can request the permission.
                ActivityCompat.requestPermissions(thisActivity,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        101);

            }
        }else {
                processFileLog(messageForLog);

        }
    }

然后处理许可的回复:

@Override
    public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 101: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    processFileLog(messageForLog);
                } else {
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                    Toast.makeText(MainActivity.this,"Permission denied, now log will not write in storage.",Toast.LENGTH_SHORT).show();

                }
                return;
            }

            // other 'case' lines to check for other
            // permissions this app might request
        }
    }

使用此方法,您可以将数据记录到文件中:

 /**
     * Tag value
     */
    private static final String mTag = "Logs";

    /**
     * File
     */
    private static File mLogFolder = null;

    private static void writeLog() {
        if (isExternalStorageWritable()) {
            mLogFolder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +
                    "/app-client-logs");
            if (!mLogFolder.exists()) {
                if (!mLogFolder.mkdirs()) {
                    System.out.println("Unable to create the log folder");
                }
            }
        } else {
            System.out.println("SD Card not available for read and write");
        }
    }

    public static void processFileLog(final String message) {
        writeLog();
        File file = new File(mLogFolder, mTag + ".log");
        try {
            BufferedWriter buf = new BufferedWriter(new FileWriter(file, true));
            String currentDateTimeString = DateFormat.getDateTimeInstance().format(System.currentTimeMillis());
            buf.append("\nSafety Net Request "+currentDateTimeString).append(":\n").append(message);
            buf.newLine();
            buf.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }