2011-04-20 7 views
19

나는 앱의 실행 결과를 저장하기위한 로그를 만들고 후자는 파이썬 코드를 사용하여 그것을 분석하고 그래프를 그려서 애플리케이션의 테스트를 자동화 할 계획이다. .안드로이드에서 장치에 로그 파일 생성 및 저장하기

응용 프로그램은 Wi-Fi 핑거 프린터입니다. 즉, 주변 환경의 Wi-Fi 장치에 대한 MAC ID, RSS (수신 된 신호 강도 및 순위 (정규화 된 RSS))와 같은 정보를 수집합니다. 따라서이 응용 프로그램을 테스트하려면 (지금은 수동으로) 결과를 기록하고 기록하십시오.

자동화가 필요합니다. 1. 로그를 장치에 저장합니다. 2. 시스템의 로그 파일에 액세스합니다. 로그 파일의 USB

형식 :

Snapshot: 1 
Fingerprint: 1, Rank: 0.23424, Boolean: true 
Fingerprint: 2, Rank: 0.42344, Boolean: false 
Fingerprint: 3, Rank: 0.23425, Boolean: true 

Snapshot: 2 
Fingerprint: 1, Rank: 0.75654, Boolean: false 
Fingerprint: 2, Rank: 0.23456, Boolean: true 
Fingerprint: 3, Rank: 0.89423, Boolean: true 

................ 

이제 기본적으로 영구 저장소에 대한 3 가지 방법이 있다는 것을 알고 있습니다 (SharedPrefs는이 시나리오에 어울리지 않습니다). 내부 저장 장치를 사용했지만 파일 형식을 MODE_WORLD_READABLE으로 설정 한 후에도 read the file using Device File Explorer in Eclipse은 불가능했습니다.

로그를 저장하기 위해 외부 저장소를 사용하는 것에 조심 스럽습니다. 장치의 USB에 파일을 쓰는 방법에 대한 자습서는 확실히 도움이 될 것입니다.

나는 저장을 위해 SQLite를 사용할 수 있도록 저장할 데이터를 구조화 할 것을 고려했다. 그러나 이로 인해 데이터간에 많은 불필요한 관계 (외국 및 국내)가 형성되고 복잡해진다. 주변에 길이 없다면, here be dragons.

기본적으로 필자는 장치에서 파일을 쓰고 싶습니다. 후자는 usb를 통해 시스템에 연결하여 읽습니다. 그것을하는 방법에 대한 도움을 많이 주시면 감사하겠습니다.

+1

http://code.google.com/p/microlog4android로 이동하십시오. – 100rabh

+0

@ 100rabh 그것을 사용하는 방법에 대한 모든 포인터? – primpap

+0

SD 카드에 쓰는 방법을 보여주는 간단한 답변과 관련된 질문입니다. http://stackoverflow.com/questions/1756296/android-writing-logs-to-text-file – RenniePet

답변

11

외장형 스토리지가 여전히 유일한 방법 일 수 있습니다. 장치에서 루트 액세스가 없으면 장치의 응용 프로그램 내에서 읽는 것이 괜찮지 않으면 실제로 "내부"에 도달 할 수 없습니다. 이 문서는 외부 파일을 생성하는 위치에 대한 확실한 가이드 라인을 제공하며 API 레벨 8 이상을 사용하는 경우 사용할 수있는 몇 가지 추가 기능이 있습니다. ...

편집이 예제 코드 IO 모든 파일이 필요한 경우 http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

는 ... 내가 몇 가지를 발굴 수 있다고 생각 : 나는 당신이이 페이지를 알고 있어야 해요,하지만 여기 어쨌든입니다 먼저 저장소의 상태를 확인하려면 위의 문서에있는 지침을 따르십시오. 불행히도 Java로 파일을 추가하는 것에 대한 경험이 없으므로 다른 누군가가 대답 할 자격이 있습니다. 여기에는 추가가 포함되지 않지만 개인용 앱 중 하나에 백업 루틴이 있습니다. 내가, 내가 ArrayAdapter와 (어댑터) 중 사용자 지정 개체 (항목)를 당겨 문자열 필드 valuse을 변환 getBytes를 사용하고 쓸 준비가되면

File backupPath = Environment.getExternalStorageDirectory(); 

    backupPath = new File(backupPath.getPath() + "/Android/data/com.maximusdev.bankrecord/files"); 

    if(!backupPath.exists()){ 
     backupPath.mkdirs(); 
    } 

    FileOutputStream fos; 
    try { 
     fos = new FileOutputStream(backupPath.getPath() + "/recordsbackup.txt"); 

     if(okaytowrite){ 
      for(int i = 0; i < count; ++i){ 
       entry = adapter.getItem(i); 
       fos.write(entry.toString().getBytes()); 
       fos.write("\n".getBytes()); 
       fos.write(String.valueOf(entry.dateTime).getBytes()); 
       fos.write("\n".getBytes()); 
       fos.write(String.valueOf(entry.sign).getBytes()); 
       fos.write("\n".getBytes()); 
       fos.write(String.valueOf(entry.cleared).getBytes()); 
       fos.write("\n".getBytes()); 
       fos.write(String.valueOf(entry.transDate).getBytes()); 
       fos.write("\n".getBytes()); 
       fos.write(entry.category.getBytes()); 
       fos.write("\n".getBytes()); 
      } 
     } 
     fos.close(); 

     Toast.makeText(this, "Backup Complete", Toast.LENGTH_SHORT).show(); 

    } catch (FileNotFoundException e) { 

     e.printStackTrace(); 

     AlertDialog.Builder delmessagebuilder = new AlertDialog.Builder(this); 

     delmessagebuilder.setCancelable(false); 

     delmessagebuilder.setMessage("File Access Error"); 

     delmessagebuilder.setNeutralButton("Okay", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       dialog.dismiss(); 
      } 
     }); 

     delmessagebuilder.create().show(); 

    } catch (IOException e) { 

     e.printStackTrace(); 

     AlertDialog.Builder delmessagebuilder = new AlertDialog.Builder(this); 

     delmessagebuilder.setCancelable(false); 

     delmessagebuilder.setMessage("File Access Error"); 

     delmessagebuilder.setNeutralButton("Okay", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       dialog.dismiss(); 
      } 
     }); 

     delmessagebuilder.create().show(); 
    } 

()는 FileOutputStream에 쓰기 기능에 전달할 . 필자는 몇 가지 연구를 해봤지만 Java/Android에서 파일을 작성하는 데 사용할 수있는 몇 가지 옵션이 있습니다. 예를 들어 FileWriter 클래스는 더 많은 연구가 필요합니다.

+0

외부 저장소 코드에 쓰기위한 파일 예 도움이 될 것이다. :) – primpap

+0

나는 내가 할 수있는 것을 보게 될 것이다. 자바는 정직하게 나의 모국어가 아니기 때문에 C 언어의 이런 예가 좀 더 속도가 될 것이다. 나는 자바로 무언가를 올리려고 노력할 것이지만, 그것은 불타 오르게 될지도 모릅니다 ... 지금 자바에서하는 모든 io는 잘 해킹되어 있습니다. 그 동안 다른 누군가가 들어오고 싶다면 반드시 환영을 받아야합니다. 특히 ... 불행히도 파일을 추가하지 않았습니다. – Maximus

+0

관심을 가져 주셔서 감사합니다. 외부 저장소에 대한 파일 io는 java에서와 다릅니다. 그래서 나는 그것을 관리 할 수있다. – primpap

11

FileWriter 객체를 작성하여 String 메시지를 로그 파일에 기록하는 매우 간단한 방법을 사용했습니다.

public static BufferedWriter out; 
     private void createFileOnDevice(Boolean append) throws IOException { 
       /* 
       * Function to initially create the log file and it also writes the time of creation to file. 
       */ 
       File Root = Environment.getExternalStorageDirectory(); 
       if(Root.canWrite()){ 
        File LogFile = new File(Root, "Log.txt"); 
        FileWriter LogWriter = new FileWriter(LogFile, append); 
        out = new BufferedWriter(LogWriter); 
        Date date = new Date(); 
        out.write("Logged at" + String.valueOf(date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() + "\n")); 
        out.close(); 

      } 
     } 

이제 로그 파일에 새 메시지를 쓰는 기능입니다.

public void writeToFile(String message){ 
      try { 
       out.write(message+"\n"); 
       out.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
+0

훨씬 더 좋은 예가이 방법을 직접 빌릴 수 있습니다. – Maximus

+1

'out.write (...)'명령문 다음에'out.close()'가 필요합니다. 그렇지 않으면 쓰기를 저장하지 않습니다. (나는 이것을 어렵게 생각했다.) – Randy

+0

일단 버퍼를'out.close()'하면 더 이상 파일에 다시 쓸 수 없다. 즉,'createFileOnDevice'에서'out.close()'를한다면, 다음'out.write()'전에'writeToFile'에서 같은 경로를 가진 새로운'FileWriter'를 생성해야합니다. – lanyusea

관련 문제