2016-09-12 6 views
0

Я использую пример, приведенный here, чтобы создать класс Logger, который записывает на стандартный вывод, но также в файл. Полный класс приведен ниже.Почему пример 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)); 
    } 

} 
+0

- ваш Android OS 6.0 или выше? –

ответ

0

Решение: Нужно установить разрешение, чтобы иметь возможность писать на внешний накопитель к манифесту:

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

Было бы хорошо, если бы были упомянуты в File документации, например. ..