2010-10-27 12 views
6

मैंने डेटा उपयोग की जांच करने के लिए एक अच्छा छोटा एंड्रॉइड ऐप लिखा है, दुर्भाग्य से यह एंड्रॉइड.net पर भारी निर्भर करता है। ट्रैफिकस्टैट जो फ्रायओ (एंड्रॉइड 2.2) के साथ पेश किया गया था।कोई बता सकता है कि ट्रैफिकस्टैट एंड्रॉइड ओएस में अपना जादू कैसे काम करता है?

मैं अपने गैर Froyo उपयोगकर्ताओं के लिए बंदरगाह वापस करने के लिए इस वर्ग के लिए प्रयास कर रहा हूँ, और क्या मैं Android source से निर्धारित करने में सक्षम हूँ है:

  1. TrafficStats.java एसी करने के लिए सिर्फ एक देशी सूचक है फ़ाइल
  2. ग फ़ाइल

गिनती यहाँ मेरी challeng या तो एक अंकीय मान यह इसे वापस थूक "का इस्तेमाल किया बाइट्स 'के रूप में मौजूद होता है तो उनकी सामग्री

  • दो फ़ाइलों (देखें नीचे) को खोलता है और पढ़ता ई ... जब मैं अपने डिवाइस पर एपीआई के माध्यम से ट्रैफिकस्टैट्स को कॉल करता हूं, तो मुझे एक पठन मिलता है (उदा। 1113853 बाइट्स)। जब मैं दो फाइलें खोलता हूं और उनकी सामग्री जांचता हूं, तो एक फ़ाइल मौजूद नहीं होती है और दूसरी फ़ाइल 0 बाइट्स होती है।

    तो स्पष्ट रूप से मुझे समझ में आया कि ट्रैफिकस्टैट क्या कर रहा है। क्या कोई इस बात पर कुछ प्रकाश डाल सकता है कि यह जादू का काम कैसे कर रहा है?

    सहायता के लिए धन्यवाद।

    package com.suttco.net; 
    
    import java.io.File; 
    import java.io.FileNotFoundException; 
    import java.io.IOException; 
    
    import com.suttco.IOUtils; 
    import com.suttco.StringUtils; 
    
    import android.util.Log; 
    
    public class TrafficStatsFile { 
    
    private static final String mobileRxFile_1 = "/sys/class/net/rmnet0/statistics/rx_bytes"; 
    private static final String mobileRxFile_2 = "/sys/class/net/ppp0/statistics/rx_bytes"; 
    private static final String mobileTxFile_1 = "/sys/class/net/rmnet0/statistics/tx_bytes"; 
    private static final String mobileTxFile_2 = "/sys/class/net/ppp0/statistics/tx_bytes"; 
    
    private static final String LOGGING_TAG = TrafficStatsFile.class.getSimpleName(); 
    
    public long getMobileRxBytes() { 
        return tryBoth(mobileRxFile_1, mobileRxFile_2); 
    } 
    
    public long getMobileTxBytes() { 
        return tryBoth(mobileTxFile_1, mobileTxFile_2); 
    } 
    
    // Return the number from the first file which exists and contains data 
    private static long tryBoth(String a, String b) { 
        long num = readNumber(a); 
        return num >= 0 ? num : readNumber(b); 
    } 
    
    // Returns an ASCII decimal number read from the specified file, -1 on error. 
    private static long readNumber(String filename) { 
        File f = new File(filename); 
        if(f.exists()) { 
        if(f.canRead()) { 
        try { 
        Log.d(LOGGING_TAG, "f.length() = " + f.length()); 
        String contents = IOUtils.readFileAsString(f); 
        if(StringUtils.IsNotNullOrEmpty(contents)) { 
         try { 
         return Long.parseLong(contents); 
         } 
         catch(NumberFormatException nfex) { 
         Log.w(LOGGING_TAG, "File contents are not numeric: " + filename); 
         } 
        } 
        else { 
         Log.w(LOGGING_TAG, "File contents are empty: " + filename); 
        } 
        } 
        catch (FileNotFoundException fnfex) { 
        Log.w(LOGGING_TAG, "File not found: " + filename, fnfex); 
        } 
        catch(IOException ioex) { 
        Log.w(LOGGING_TAG, "IOException: " + filename, ioex); 
        } 
        } 
        else { 
        Log.w(LOGGING_TAG, "Unable to read file: " + filename); 
        } 
        } 
        else { 
        Log.w(LOGGING_TAG, "File does not exist: " + filename); 
        } 
        return -1; 
    } 
    } 
    
  • +0

    लिंक घायल हो गया, इस प्रयास करें: http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/jni/android_net_TrafficStats .cpp; h = ff46bdd2ba39380a0a673cbf8aadfc5a3529156c; hb = refs/head/master –

    +0

    या यहां कैश प्रतिलिपि: http://google.com/codesearch#uX1GffpyOZk/core/jni/android_net_TrafficStats.cpp&q=TrafficStats.cpp – Idolon

    +0

    लिंक टूटा हुआ है, और यहां तक ​​कि यदि आपको android_net_TrafficStats.cpp मिल जाए, तो उन काउंटरों से संबंधित कोड नवीनतम संशोधन पर वहां से स्थानांतरित हो गया था। तो, सही संशोधन का लिंक यहां है: https://github.com/android/platform_frameworks_base/blob/3762c311729fe9f3af085c14c5c1fb471d994c03/core/jni/android_net_TrafficStats.cpp – Eduardo

    उत्तर

    11

    ऊपर दिए गए कोड का एक कामकाजी, संशोधित संस्करण यहां दिया गया है। यह RandomAccessFile का उपयोग कर रहा है और कस्टम imports पर भरोसा नहीं करता है, लेकिन केवल के साथ अंतर्निहित String फ़ंक्शंस का उपयोग करता है। स्रोत के लिए

    import java.io.FileNotFoundException; 
    import java.io.IOException; 
    import java.io.RandomAccessFile; 
    
    import android.util.Log; 
    
    public class TrafficStatsFile { 
    
    private static final String mobileRxFile_1 = "/sys/class/net/rmnet0/statistics/rx_bytes"; 
    private static final String mobileRxFile_2 = "/sys/class/net/ppp0/statistics/rx_bytes"; 
    private static final String mobileTxFile_1 = "/sys/class/net/rmnet0/statistics/tx_bytes"; 
    private static final String mobileTxFile_2 = "/sys/class/net/ppp0/statistics/tx_bytes"; 
    
    private static final String LOGGING_TAG = TrafficStatsFile.class.getSimpleName(); 
    
    public long getMobileRxBytes() { 
        return tryBoth(mobileRxFile_1, mobileRxFile_2); 
    } 
    
    public long getMobileTxBytes() { 
        return tryBoth(mobileTxFile_1, mobileTxFile_2); 
    } 
    
    // Return the number from the first file which exists and contains data 
    private static long tryBoth(String a, String b) { 
        long num = readNumber(a); 
        return num >= 0 ? num : readNumber(b); 
    } 
    
    // Returns an ASCII decimal number read from the specified file, -1 on error. 
    private static long readNumber(String filename) { 
        try { 
         RandomAccessFile f = new RandomAccessFile(filename, "r"); 
         try { 
          Log.d(LOGGING_TAG, "f.length() = " + f.length()); 
          String contents = f.readLine(); 
          if(!contents.isEmpty() && contents!=null) { 
           try { 
            return Long.parseLong(contents); 
           } 
           catch(NumberFormatException nfex) { 
            Log.w(LOGGING_TAG, "File contents are not numeric: " + filename); 
           } 
          } 
          else { 
           Log.w(LOGGING_TAG, "File contents are empty: " + filename); 
          } 
         } 
         catch (FileNotFoundException fnfex) { 
          Log.w(LOGGING_TAG, "File not found: " + filename, fnfex); 
         } 
         catch(IOException ioex) { 
          Log.w(LOGGING_TAG, "IOException: " + filename, ioex); 
         } 
        }catch(FileNotFoundException ffe){ 
         Log.w(LOGGING_TAG, "File not found: " + filename, ffe); 
        } 
        return -1; 
    } 
    
    } 
    
    +1

    मुझे कुछ भी देने के लिए धन्यवाद ... – IBoS

    +0

    कोई भी नहीं निम्नलिखित निर्देशिका मेरे डिवाइस में मौजूद हैं: rmnet0, ppp0, rmnet0 और ppp0। मैं सैमसंग एसएम-टी 111 का उपयोग कर रहा हूं। क्या वह उपकरण निर्भर है? – Gem

    4

    एक RandomAccessFile करने के लिए इसे बदलने के बजाय फ़ाइल काम किया (यहाँ जावा के लिए ग फ़ाइल बंदरगाह करने के लिए अपने प्रयास है)।

    संपादित करें: कार्य कोड के लिए आईबीओएस का जवाब देखें। उसे स्वीकार किए गए उत्तर को बदलना।

    संबंधित मुद्दे