2012-01-05 16 views
22

का सिस्टम समय सेट करना मैं वर्तमान में सॉफ्टवेयर में एंड्रॉइड सिस्टम समय सेट करने की कोशिश कर रहा हूं। हाँ, मुझे पता है कि कई लोगों ने कोशिश की - और अब मैं ऐसा करने में असफल रहा। :-)रूट फोन

लेकिन मुझे यह भी पता है कि रूट सिस्टम पर एंड्रॉइड सिस्टम समय सेट करना संभव है। मेरे पास क्लॉकसिंक नामक एक ऐप टेस्टेट है जो एक्साक्लिटी करता है।

तो मैं जो चाहता हूं वह पता लगाया गया है कि रूट डिवाइस पर सिस्टम समय कैसे सेट करें। कृपया यह न कहें कि यह संभव नहीं है। :-)

मैंने कोशिश की क्या अब तक निम्न अनुमतियों स्थापित कर रही है:

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

और फिर मेरी कोड में:

AlarmManager a = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
long current_time_millies = System.currentTimeMillis(); 
try { 
    a.setTime((long)current_time_millies+10000); 
} catch (Exception e) { 
// Why is this exception thrown? 
} 

लेकिन मैं हमेशा निम्न अपवाद प्राप्त करें:

java.lang.SecurityException: setTime: न तो उपयोगकर्ता 10054 और न ही वर्तमान प्रक्रिया में android.permission.SET_TIME है।

मैं उसी डिवाइस पर परीक्षण कर रहा हूं जहां क्लॉकसिंक पूरी तरह से काम करता है। तो मैं क्या गलत हूं? या बेहतर: क्या आप परीक्षण कोड प्रदान कर सकते हैं जो काम करता है?

उत्तर

51

सबसे पहले, मैं ClockSync का डेवलपर हूं और मुझे एंड्रॉइड पर समय निर्धारित करने के बारे में कुछ पता है।

मुझे डर है कि Violet Giraffe द्वारा प्रदान किया गया उत्तर सही नहीं है। समस्या यह है कि सामान्य उपयोगकर्ता अनुप्रयोग SET_TIME अनुमति तक पहुंच प्राप्त नहीं कर सकता है। यह अनुमति केवल सिस्टम अनुप्रयोगों द्वारा उपयोग की जा सकती है जो रोम के हिस्से के रूप में स्थापित हैं या रोम के समान ही कुंजी के साथ हस्ताक्षरित हैं (विक्रेता पर निर्भर करता है)। इस दृष्टिकोण का उपयोग कर रहे अनुप्रयोगों में से एक NTPc है। यह एओएसपी कुंजी के साथ हस्ताक्षरित है और एओएसपी आधारित एंड्रॉइड रोम, जैसे कि साइनोजनमोड पर स्थापित किया जा सकता है। ध्यान दें कि Google ने हाल ही में मार्केट से एओएसपी कुंजी पर प्रतिबंध लगा दिया है और लेखक कभी भी अपने आवेदन को अपडेट नहीं कर पाएंगे। अधिकांश फोन पर नियमित रोम पर एनटीपीसी स्थापित नहीं किया जा सकता है।

यदि आपको विवरण की आवश्यकता है, तो प्रसिद्ध समस्या 4581: Allow user apps to set the system time के लिए टिप्पणियां पढ़ने के लिए सुनिश्चित करें। ध्यान दें कि विचाराधीन था गूगल द्वारा निम्न टिप्पणी के साथ अस्वीकृत:

हाय, यह डिजाइन है कि आवेदन पत्र समय नहीं बदल सकते कर रहा है। वहां सुरक्षा के कई सूक्ष्म पहलू हैं जो वर्तमान समय पर निर्भर हो सकते हैं, जैसे सर्टिफिकेट समाप्ति, लाइसेंस प्रबंधन इत्यादि। हम नहीं हैं, तीसरे पक्ष के अनुप्रयोगों को विश्व स्तर पर को सिस्टम को बाधित करने की अनुमति देना चाहते हैं।


एक निहित डिवाइस पर समय निर्धारित करें:

क्या ClockSync समय निर्धारित करने की करता है /dev/alarm डिवाइस की अनुमति बदल रहा है। अनिवार्य रूप से, यह रूट खोल में chmod 666 /dev/alarm चलाता है।एक बार इस डिवाइस के सभी उपयोगकर्ताओं के लिए लिखने की अनुमति हो, SystemClock.setCurrentTimeMillis(...) कॉल सफल हो जाएगा। कुछ अनुप्रयोग एक और दृष्टिकोण का उपयोग करते हैं, वे उचित तर्क के साथ रूट खोल में date कमांड चलाते हैं, हालांकि यह त्रुटि प्रवण है और कम सटीक है क्योंकि सुपरसियर खोल और कमांड निष्पादन में कई सेकंड लग सकते हैं। इस तरह के आवेदन का एक उदाहरण Sytrant है।

डिफ़ॉल्ट रूप से ClockSync केवल 666 अनुमति सेट करता है अगर /dev/alarm पहले से ही लिखने योग्य नहीं है। यह सीपीयू/बैटरी बचाता है क्योंकि su/superuser.apk निष्पादन अपेक्षाकृत महंगा है। यदि आप सुरक्षा के बारे में चिंता करते हैं, तो पुनर्स्थापना अनुमति विकल्प है जो समय सेट करने के बाद अलार्म डिवाइस अनुमति 664 बना देगा।

एप्लिकेशन से आसान रूट खोल पहुंच के लिए मैं अपने स्वयं के सहायक वर्ग का उपयोग कर रहा हूं: ShellInterface। एक और विकल्प RootTools लाइब्रेरी का उपयोग करना है।

public void setTime(long time) { 
    if (ShellInterface.isSuAvailable()) { 
     ShellInterface.runCommand("chmod 666 /dev/alarm"); 
     SystemClock.setCurrentTimeMillis(time); 
     ShellInterface.runCommand("chmod 664 /dev/alarm"); 
    } 
    } 

अन्य Android स्थापित करने समय से संबंधित मुद्दों की जांच करने के लिए स्वतंत्र महसूस:

यहाँ नमूना ShellInterface वर्ग के आधार पर कोड है


आप रूट का उपयोग और सिस्टम का समय परिवर्तित किए बिना आवेदन में सटीक समय की जरूरत है, तो आप Joda Time के आधार पर उदाहरण के लिए अपने स्वयं के टाइमर हो सकता है,। आप लाइब्रेरी से एनटीपी क्लाइंट का उपयोग करके एनटीपी सर्वर से समय प्राप्त कर सकते हैं।

+0

मैं/dev/अलार्म 666 के साथ सेट मिल गया है और setCurrentTimeMillis बोल रहा हूँ की तरह जड़ें डिवाइस पर प्रणाली का दिनांक और समय सेट कर सकते हैं, लेकिन यह हमेशा झूठे रिटर्न – TimothyP

+1

@TimothyP यह भी हो सकता है KNOX (SELinux) के साथ नवीनतम सैमसंग फर्मवेयर पर सक्षम। इसे दूर करने का एकमात्र तरीका @ तारीख 'कमांड लाइन कॉल का उपयोग करना है जैसा कि @ करन द्वारा सुझाया गया है। 'date' कमांड मिलीसेकंड का समर्थन नहीं करता है, इसलिए मेरा सुझाव है कि आप परमाणु समय के आधार पर टाइमर का उपयोग करके दूसरी शुरुआत के साथ कमांड कॉल को संरेखित करें। – CrazyCoder

+0

मैं देखता हूं, अभी मुझे एक क्यूबबोर्ड पर समस्या है, मैं इंजीनियरों से पूछूंगा कि क्या उन्होंने इसे अवरुद्ध करने के लिए कुछ किया है। इस बीच मैं आपके सुझाव का पालन करूंगा thnx – TimothyP

9

आप इस

public void setDate() 
    { 
     try { 
      Process process = Runtime.getRuntime().exec("su"); 
     DataOutputStream os = new DataOutputStream(process.getOutputStream()); 
      os.writeBytes("date -s 20120419.024012; \n"); 
     } catch (Exception e) { 
      Log.d(TAG,"error=="+e.toString()); 
      e.printStackTrace(); 
     } 
    } 
+1

यह खराब विकल्प है क्योंकि जब भी आपको घड़ी सेट करने की आवश्यकता होती है, तो उसे खोलने की आवश्यकता होती है, डेट कमांड को निष्पादित करने में कुछ समय लगेगा, इसलिए कम परिशुद्धता, कुछ उपकरणों पर डेट कमांड अलग-अलग प्रारूप का उपयोग करता है और काम नहीं करेगा। – CrazyCoder

+2

धन्यवाद दोस्त रूट डिवाइस के साथ अपना काम –

+0

अच्छा जवाब। धन्यवाद! – breceivemail