为什么Logger示例不会创建请求的目录?

时间:2016-09-12 17:25:39

标签: android logging

我使用给定here的示例创建一个Logger类,该类写入标准输出,但也写入文件。完整的课程如下。

但是,在最简单的主要活动中编译并使用对该记录器的调用之后,我收到以下错误:

 E/com.example.alexander.bootservice.Logger: initExternal() -> IOException
     java.io.FileNotFoundException: /storage/emulated/0/MyLogger/test.log: open failed: ENOENT (No such file or directory)
          at libcore.io.IoBridge.open(IoBridge.java:456)
          at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
          at java.io.FileWriter.<init>(FileWriter.java:58)
          at com.example.alexander.bootservice.Logger.init(Logger.java:34)
          at com.example.alexander.bootservice.Logger.log(Logger.java:45)
          at com.example.alexander.bootservice.Logger.d(Logger.java:65)
          at com.example.alexander.bootservice.MainActivity.onCreate(MainActivity.java:12)
          at android.app.Activity.performCreate(Activity.java:5977)
          at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2258)
          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2365)
          at android.app.ActivityThread.access$800(ActivityThread.java:148)
          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283)
          at android.os.Handler.dispatchMessage(Handler.java:102)
          at android.os.Looper.loop(Looper.java:135)
          at android.app.ActivityThread.main(ActivityThread.java:5272)
          at java.lang.reflect.Method.invoke(Native Method)
          at java.lang.reflect.Method.invoke(Method.java:372)
          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)
          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)

既没有创建目录也没有创建日志文件。但错误在哪里?

其他信息:dir.mkdirs()返回'false'。

package com.example.alexander.bootservice;

import android.os.Environment;
import android.util.Log;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Created by alexander on 12/09/16.
 */
public class Logger {

    public static PrintWriter printWriter = null;
    public static String LOG_DIR = "/MyLogger";
    public static String LOG_FILE = "test.log";

    private static void init() {

        // Check if external media is writable
        String state = Environment.getExternalStorageState();

        if (!Environment.MEDIA_MOUNTED.equals(state)) {
            Log.e(Logger.class.getName(), "Cannot write to external media");
            return;
        }

        if (printWriter == null) {
            try {
                File dir = new File(Environment.getExternalStorageDirectory() + LOG_DIR);
                dir.mkdirs();
                printWriter = new PrintWriter(new FileWriter(new File(dir, LOG_FILE), true)); // Line 34
            } catch (IOException e) {
                Log.e(Logger.class.getName(), "initExternal() -> IOException", e);
            }
        }
    }

    private static synchronized int log(int priority, String tag, String msg) {
        int res = Log.println(priority, tag, msg);

        if (printWriter == null) {
            init(); // May be called just once, depending on your requirements
        }

        printWriter.print(tag + "   ");
        printWriter.print(msg + "\r\n");
        printWriter.flush();
        return res;
    }


    // Duplicates of standard android.util.Log methods:
    public static int v(String tag, String msg) {
        return log(Log.VERBOSE, tag, msg);
    }

    public static int v(String tag, String msg, Throwable tr) {
        return log(Log.VERBOSE, tag, msg + '\n' + Log.getStackTraceString(tr));
    }

    public static int d(String tag, String msg) {
        return log(Log.DEBUG, tag, msg);
    }

    public static int d(String tag, String msg, Throwable tr) {
        return log(Log.DEBUG, tag, msg + '\n' + Log.getStackTraceString(tr));
    }

    public static int i(String tag, String msg) {
        return log(Log.INFO, tag, msg);
    }

    public static int i(String tag, String msg, Throwable tr) {
        return log(Log.INFO, tag, msg + '\n' + Log.getStackTraceString(tr));
    }

    public static int w(String tag, String msg) {
        return log(Log.WARN, tag, msg);
    }

    public static int w(String tag, String msg, Throwable tr) {
        return log(Log.WARN, tag, msg + '\n' + Log.getStackTraceString(tr));
    }

    public static int e(String tag, String msg) {
        return log(Log.ERROR, tag, msg);
    }

    public static int e(String tag, String msg, Throwable tr) {
        return log(Log.ERROR, tag, msg + '\n' + Log.getStackTraceString(tr));
    }

}

1 个答案:

答案 0 :(得分:0)

解决方案:必须设置一个权限才能将外部存储写入Manifest:

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

如果File文档中提到了例如......

,那会很好