2012-01-05 53 views
22

Tôi hiện đang cố gắng đặt thời gian hệ thống Android bằng phần mềm. Vâng, tôi biết rằng nhiều người đã thử nó - và thất bại như tôi làm bây giờ. :-)Cài đặt thời gian hệ thống của điện thoại ROOTED

Nhưng tôi cũng biết rằng có thể đặt thời gian hệ thống Android trên điện thoại ROOTED. Tôi có testet một ứng dụng gọi là ClockSync mà exaclty đó.

Vì vậy, những gì tôi muốn là tìm hiểu cách đặt thời gian hệ thống trên các thiết bị ROOTED. Xin đừng nói rằng điều đó là không thể. :-)

gì tôi đã cố gắng cho đến nay là thiết lập các điều khoản sau đây:

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

Và sau đó trong mã của tôi:

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? 
} 

Nhưng tôi luôn luôn nhận được ngoại lệ sau đây:

java.lang.SecurityException: setTime: Cả người dùng 10054 lẫn quy trình hiện tại đều không có android.permission.SET_TIME.

Tôi đang thử nghiệm trên cùng một thiết bị mà ClockSync hoạt động hoàn hảo. Vậy - tôi đang làm gì sai? Hoặc tốt hơn: Bạn có thể cung cấp mã thử nghiệm hoạt động không?

Trả lời

51

Trước hết, tôi là nhà phát triển của ClockSync và tôi biết điều gì đó về việc đặt thời gian trên Android.

Tôi sợ câu trả lời được cung cấp bởi Violet Giraffe không chính xác. Vấn đề là ứng dụng người dùng bình thường không thể truy cập vào quyền truy cập SET_TIME. Quyền này chỉ có thể được sử dụng bởi các ứng dụng hệ thống được cài đặt như là một phần của ROM hoặc được ký bằng cùng khóa với bản thân ROM (phụ thuộc vào nhà cung cấp). Một trong những ứng dụng đang sử dụng phương pháp này là NTPc. Nó được ký với khóa AOSP và có thể được cài đặt trên các ROM Android dựa trên AOSP, chẳng hạn như CyanogenMod. Lưu ý rằng Google đã cấm các khóa AOSP từ Market gần đây và tác giả sẽ không bao giờ có thể cập nhật ứng dụng của mình. Không thể cài đặt NTPc trên các ROM thông thường được sử dụng trên hầu hết các điện thoại.

Nếu bạn cần chi tiết, hãy đảm bảo đọc nhận xét cho số nổi tiếng 4581: Allow user apps to set the system time. Lưu ý rằng vấn đề là bị từ chối bởi Google với nhận xét sau:

Xin chào, đó là do thiết kế ứng dụng không thể thay đổi thời gian. Có là nhiều khía cạnh tinh vi về bảo mật có thể dựa vào thời gian hiện tại, chẳng hạn như hết hạn giấy chứng nhận, quản lý giấy phép, v.v. Chúng tôi không muốn cho phép các ứng dụng của bên thứ ba phá vỡ toàn bộ hệ thống theo cách này.


Làm thế nào để thiết lập thời gian trên một thiết bị bắt nguồn từ:

ClockSync nào để thiết lập thời gian đang thay đổi sự cho phép của thiết bị /dev/alarm. Về cơ bản, nó chạy chmod 666 /dev/alarm trong vỏ gốc.Khi thiết bị này có quyền ghi cho tất cả người dùng, số gọi SystemClock.setCurrentTimeMillis(...) sẽ thành công. Một số ứng dụng sử dụng cách tiếp cận khác, chúng chạy lệnh date trong trình bao gốc với các đối số thích hợp, tuy nhiên nó dễ bị lỗi và kém chính xác hơn vì trình siêu người dùng và thực thi lệnh có thể mất vài giây. Ví dụ về ứng dụng như vậy là Sytrant.

Theo mặc định, ClockSync đặt quyền 666 chỉ khi /dev/alarm chưa được ghi. Điều này tiết kiệm CPU/pin vì su/Superuser.apk thực hiện là tương đối đắt tiền. Nếu bạn lo lắng về bảo mật, có Khôi phục quyền tùy chọn sẽ cho phép thiết bị báo động 664 sau khi đặt thời gian.

Để truy cập trình bao gốc root dễ dàng hơn từ ứng dụng tôi đang sử dụng lớp trợ giúp của riêng mình: ShellInterface. Một tùy chọn khác là sử dụng thư viện RootTools.

Đây là đoạn mã mẫu dựa trên lớp ShellInterface:

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

Hãy thoải mái để kiểm tra các vấn đề Android khác liên quan đến thời gian đông kết:


Nếu bạn cần thời gian chính xác trong việc áp dụng mà không sử dụng gốc và thay đổi thời gian hệ thống, bạn có thể có tính giờ riêng của bạn, ví dụ dựa trên Joda Time. Bạn có thể lấy thời gian từ các máy chủ NTP bằng ứng dụng NTP từ thư viện .

+0

Tôi đã có/dev/báo động thiết lập với 666 và đang kêu gọi setCurrentTimeMillis, nhưng nó luôn luôn trả về false – TimothyP

+1

@TimothyP nó có thể xảy ra trên các firmware mới nhất của Samsung với KNOX (SELinux) được bật. Cách duy nhất để khắc phục nó là sử dụng cuộc gọi dòng lệnh 'date' như được đề xuất bởi @Karan. Lệnh 'date' không hỗ trợ mili giây, vì vậy tôi khuyên bạn nên căn chỉnh lệnh gọi với lần bắt đầu thứ hai bằng bộ đếm thời gian dựa trên thời gian nguyên tử. – CrazyCoder

+0

Tôi hiểu rồi, ngay bây giờ tôi đang gặp vấn đề trên bàn điều khiển, tôi sẽ hỏi các kỹ sư nếu họ đã làm gì đó để chặn nó. Trong khi đó tôi sẽ làm theo đề nghị của bạn thnx – TimothyP

9

bạn có thể đặt ngày hệ thống và thời gian trên thiết bị bắt nguồn như thế này

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

Nó thay thế nghèo vì nó sẽ gọi vỏ mỗi khi bạn cần cài đặt đồng hồ, lệnh ngày sẽ mất một chút thời gian để thực thi, do đó ít chính xác hơn, cũng lệnh ngày trên một số thiết bị sử dụng định dạng khác và sẽ không hoạt động. – CrazyCoder

+2

cảm ơn bạn thân công việc của nó với thiết bị bắt nguồn từ –

+0

câu trả lời hay. cảm ơn! – breceivemail

Các vấn đề liên quan