2012-01-23 13 views
7

मैं बिना किसी अपवाद को संभालने के द्वारा बल बंद त्रुटि का प्रबंधन करने के लिए ACRA लाइब्रेरी का उपयोग कर सकता हूं। रिपोर्ट Google डॉक के लिए भेजा जा सकता है।, ईमेल और कस्टम वेब सेवा सफलतापूर्वक ..एसीआरए: मैं एसीआरए रिपोर्ट को फ़ाइल (एसडी कार्ड में) कैसे लिख सकता हूं?

लेकिन क्या मैं चाहता हूँ ..

  • मैं कैसे रिपोर्ट लिखने दायर करने के लिए [पूर्व कर सकते हैं। sdcard/myapp/myLog.txt]?

मैं ऐसा क्यों चाहते हैं ..

  • मेरे एप्लिकेशन को उपयोगकर्ता जबकि बलपूर्वक बंद करना होता है इंटरनेट कनेक्शन .. नहीं हो सकता है यदि ऐसा है तो फिर मैं, रिपोर्ट याद आती है अगर मैं करने के लिए रिपोर्ट लिखेंगे फ़ाइल तो इंटरनेट कनेक्शन उपलब्ध होने पर मैं अपने सर्वर पर भेज सकता हूं।

उत्तर

8

मुझे लगता है कि आप जो हासिल करना चाहते हैं वह पहले ही एसीआरए द्वारा किया जा चुका है। यहाँ मैं अपने अब्द logcat में देखते है:

01-23 12:15:28.056: D/ACRA(614): Writing crash report file. 
01-23 12:15:28.136: D/ACRA(614): Mark all pending reports as approved. 
01-23 12:15:28.136: D/ACRA(614): Looking for error files in /data/data/com.ybi/files 
01-23 12:15:28.136: V/ACRA(614): About to start ReportSenderWorker from #handleException 
01-23 12:15:28.146: D/ACRA(614): Add user comment to null 
01-23 12:15:28.146: D/ACRA(614): #checkAndSendReports - start 
01-23 12:15:28.146: D/ACRA(614): Looking for error files in /data/data/com.ybi/files 

पहली बात यह है कि ACRA अपने अनुप्रयोग के भीतर भंडारण पर एक फ़ाइल पर एक रिपोर्ट पैदा कर रही है। फिर यदि आप ऑनलाइन हैं और त्रुटिरोधक सही ढंग से प्रारंभ किया गया है, तो यह रिपोर्ट भेजता है। अन्यथा, डेटा संग्रहण में रिपोर्ट रखी जाती है (बाद में भेजने के लिए)।

मैंने डेटा को नहीं देखा लेकिन मैं वर्तमान में एक कस्टम लॉगर पर काम कर रहा हूं। तो अगर आप ACRA से एक ही काम करने के लिए चाहते हैं, यह आसान है:

ACRA.init(this); 

    // a custom reporter for your very own purposes 
    ErrorReporter.getInstance().setReportSender(new LocalReportSender(this)); 

और फिर:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Map; 
import java.util.Set; 

import org.acra.ACRA; 
import org.acra.CrashReportData; 
import org.acra.ReportField; 
import org.acra.sender.ReportSender; 
import org.acra.sender.ReportSenderException; 

import android.content.Context; 

import de.akquinet.android.androlog.Log; 

public class LocalReportSender implements ReportSender { 

private final Map<ReportField, String> mMapping = new HashMap<ReportField, String>() ; 
private FileOutputStream crashReport = null; 

public LocalReportSender(Context ctx) { 
    // the destination 
    try { 
     crashReport = ctx.openFileOutput("crashReport", Context.MODE_WORLD_READABLE); 
    } catch (FileNotFoundException e) { 
     Log.e("TAG", "IO ERROR",e); 
    } 
} 

@Override 
public void send(CrashReportData report) throws ReportSenderException { 

    final Map<String, String> finalReport = remap(report); 

    try { 
     OutputStreamWriter osw = new OutputStreamWriter(crashReport); 

     Set set = finalReport.entrySet(); 
     Iterator i = set.iterator(); 

     while (i.hasNext()) { 
      Map.Entry<String,String> me = (Map.Entry) i.next(); 
      osw.write("[" + me.getKey() + "]=" + me.getValue()); 
     } 

     osw.flush(); 
     osw.close(); 
    } catch (IOException e) { 
     Log.e("TAG", "IO ERROR",e); 
    } 

} 

private static boolean isNull(String aString) { 
    return aString == null || ACRA.NULL_VALUE.equals(aString); 
} 

private Map<String, String> remap(Map<ReportField, String> report) { 

    ReportField[] fields = ACRA.getConfig().customReportContent(); 
    if (fields.length == 0) { 
     fields = ACRA.DEFAULT_REPORT_FIELDS; 
    } 

    final Map<String, String> finalReport = new HashMap<String, String>(
      report.size()); 
    for (ReportField field : fields) { 
     if (mMapping == null || mMapping.get(field) == null) { 
      finalReport.put(field.toString(), report.get(field)); 
     } else { 
      finalReport.put(mMapping.get(field), report.get(field)); 
     } 
    } 
    return finalReport; 
} 

} 

मैं पूरी तरह से इसे अभी तक परीक्षण नहीं किया था, लेकिन आप विचार मिलता है। आशा करता हूँ की ये काम करेगा।

+0

आपको बहुत अधिक उपयोगकर्ता 1102206 धन्यवाद, क्या आपके पास विचार है, हम उन ट्रैक को कैसे भेज सकते हैं जो पुन: प्रारंभ करने के बाद गतिविधि में बटन पर क्लिक करके फ़ाइल में लिखे गए हैं [एप्लिकेशन को फिर से खोलें]? स्वचालित रूप से रिपोर्ट भेजने की बजाय। ** Req: पूरी तरह से परीक्षण के बाद। कृपया उत्तर अपडेट करें। ** b'coz इस बारे में कोई अच्छी पोस्ट नहीं मिली .. इसलिए यह दूसरों के लिए भी अधिक उपयोगी होगी .. – Jayabal

+1

धन्यवाद बाया। एसीआरए पर आपके शुरुआती प्रश्न के बारे में, पहला बिंदु आपके प्रश्न का उत्तर देता है: यदि आपका ऐप दुर्घटनाग्रस्त हो जाता है, तो एसीआरए इंटरनेट कनेक्शन उपलब्धता से निपटने के लिए, हाथ से इसे करने की आवश्यकता नहीं है। एक रिपोर्ट भेजने के बारे में, कुछ चीजें Acra वेबसाइट में उपलब्ध हैं (यहां: http://code.google.com/p/acra/source/browse/trunk/acra/src/main/java/org/acra/sender /)। उपरोक्त कोड एक वर्ग द्वारा प्रेरित तरीके से है। मेरा पूरा मतलब है जब मैंने पूरी तरह से परीक्षण किया था, मामूली मामला है: रिपोर्ट के लिए डिवाइस पर कोई स्थान नहीं छोड़ा गया है, एसडीकार्ड पर लिखने के लिए कोई विशेषाधिकार नहीं है, एक्र्रा कॉन्फ़िगरेशन ठीक से सेट नहीं है, आदि – Gomoku7

+0

बहिष्कृत समाधान, कृपया, उपयोगकर्ता 2302510 उत्तर – dayanruben

0

मैंने एसीआरए का उपयोग किया है लेकिन इस रूप में नहीं (मेरे सर्वर पर लॉग भेजने के लिए उपयोग किया जाता है), इसलिए मुझे यकीन नहीं है कि यह कैसे करें।
लेकिन इस तरह के मामले में आप अन्य libs/apis का उपयोग करके पूरी तरह से सिस्टम लॉग प्राप्त नहीं कर सकते हैं (यह एक विस्तृत एक होगा) और इसे फ़ाइल में लिखना।

या, आप क्या कर सकते हैं, एसीआरए ज़िप के कोड का उपयोग करें और इसे थोड़ा सा संशोधित करें। फ़ाइल को "क्रैशरपोर्टडाटा.जावा" या "क्रैश रिपोर्टरडिअलॉग.जावा" फ़ाइल का उपयोग करके और वहां से सामग्री लाने और सहेजने के लिए यह आपकी फाइल में है।

मैं इसके संस्करण 4.2.3 के बारे में बात कर रहा हूं।

+0

आप akkilis का शुक्र है, मैं उन फ़ाइलों के माध्यम से परिवर्तन करने के लिए जाना होगा की कोशिश है .. – Jayabal

6

मैं @ Gomoku7 से जवाब लगता है कि कुछ पदावनत कोड तो मैं बस समाधान है कि मैं प्रयोग किया जाता है पोस्ट करेंगे होता है:

OnCreate() में इस कॉल:

ACRA.init(this); 
ACRA.getErrorReporter().setReportSender(new LocalReportSender(this)); 

यहाँ मैं मूल रूप से बदल दिया है BufferedWriter का उपयोग करने के लिए कोड ताकि मैं सीधे एसडी कार्ड पर लिख सकूं जो openFileOutput() के साथ संभव नहीं था। इसलिए केवल send() विधि और कन्स्ट्रक्टर LocalReportSender() थोड़ा बदल गया है।

नोट: ध्यान रखें कि लॉगफ़ाइल काफी तेजी से बढ़ता है तो सुनिश्चित करें कि आप नहीं एक लॉग फ़ाइल की वजह से अपने उपयोगकर्ता के एसडी कार्ड के अंतरिक्ष के एमबीएस ऊपर लेते हैं :)

private class LocalReportSender implements ReportSender { 

    private final Map<ReportField, String> mMapping = new HashMap<ReportField, String>(); 
    private FileWriter crashReport = null; 

    public LocalReportSender(Context ctx) { 
     // the destination 
     File logFile = new File(Environment.getExternalStorageDirectory(), "log.txt"); 

     try { 
      crashReport = new FileWriter(logFile, true); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void send(CrashReportData report) throws ReportSenderException { 
     final Map<String, String> finalReport = remap(report); 

     try { 
      BufferedWriter buf = new BufferedWriter(crashReport); 

      Set<Entry<String, String>> set = finalReport.entrySet(); 
      Iterator<Entry<String, String>> i = set.iterator(); 

      while (i.hasNext()) { 
       Map.Entry<String, String> me = (Entry<String, String>) i.next(); 
       buf.append("[" + me.getKey() + "]=" + me.getValue()); 
      } 

      buf.flush(); 
      buf.close(); 
     } catch (IOException e) { 
      Log.e("TAG", "IO ERROR", e); 
     } 
    } 

    private boolean isNull(String aString) { 
     return aString == null || ACRAConstants.NULL_VALUE.equals(aString); 
    } 

    private Map<String, String> remap(Map<ReportField, String> report) { 

     ReportField[] fields = ACRA.getConfig().customReportContent(); 
     if (fields.length == 0) { 
      fields = ACRAConstants.DEFAULT_REPORT_FIELDS; 
     } 

     final Map<String, String> finalReport = new HashMap<String, String>(
       report.size()); 
     for (ReportField field : fields) { 
      if (mMapping == null || mMapping.get(field) == null) { 
       finalReport.put(field.toString(), report.get(field)); 
      } else { 
       finalReport.put(mMapping.get(field), report.get(field)); 
      } 
     } 
     return finalReport; 
    } 

} 
+0

धन्यवाद! यह मेरे लिए यहां से एक ब्लॉक प्रतिलिपि के साथ काम करता है, और लापता आयात को ठीक करने के ग्रहण के साथ। लिखित फाइल एसडीकार्ड की जड़ पर जाती है, और 27k है। अत्यधिक सिफारिशित! –

0

समाधान ऊपर पूरी तरह से काम करता है हो सकता है हो सकता है। शायद केवल एक बात, तो फ़ाइल फ़ाइल एक्सप्लोरर का उपयोग करते हुए दिखाई नहीं देता है, Intent.ACTION_MEDIA_SCANNER_SCAN_FILE

के इरादे प्रसारण जोड़ने के लिए

check this link