2011-01-25 46 views
15

Tôi đã cố gắng khôi phục cài đặt gốc trong Android bằng cách sử dụng lớp RecoverySystem, nhưng tôi nhận được các lỗi quyền, mà tôi không thể ghi đè vì chúng là quyền của hệ thống. Tôi muốn biết nếu có một cách khác để thực hiện khôi phục cài đặt gốc?Thiết lập lại Android Factory Lập trình

+6

theo cách thủ công? Tại sao một ứng dụng * bao giờ * cần quyền để thực hiện khôi phục cài đặt gốc? – kcoppock

+10

Điều này nghe có vẻ rất tinh ranh. Nếu người dùng muốn khôi phục cài đặt gốc, họ có thể tự làm. Những quyền đó có lý do rất tốt. – Jems

+4

Chưa kể, nếu ứng dụng của bạn đã làm điều này, nó cũng sẽ biến mất sau khi khôi phục cài đặt gốc ... – kcoppock

Trả lời

0

Tôi khuyên bạn nên đưa người dùng đến hoạt động cài đặt phù hợp và để họ tự làm điều đó.

Xem hoạt động this tutorial và sử dụng các thiết lập android.provider.Settings.ACTION_PRIVACY_SETTINGS

3

này hoạt động trên một thiết bị khác nhau tôi đã cố gắng. (hơn 20)

Context foreignContext = createPackageContext("com.android.settings", Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE); 
Class<?> yourClass = foreignContext.getClassLoader().loadClass("com.android.settings.MasterClear"); 

Intent intent = new Intent(foreignContext, yourClass); 
startActivity(intent); 
+4

Điều này sẽ không còn hoạt động như trên Android 3.0 nữa. Sử dụng API quản trị thiết bị để yêu cầu xóa thiết bị. – CommonsWare

11

Ứng dụng của bên thứ ba chắc chắn nhất có thể thực hiện điều này.

Trên 2.2 thiết bị (bao gồm mới nhất 4.x), bạn sẽ phải sử dụng DevicePolicyManager và bao gồm các quyền trong tệp AndroidManifest.xml. Đối với các thiết bị cũ hơn, bạn có thể sử dụng bộ tải ngữ cảnh nước ngoài như được mô tả trong câu trả lời khác.

import android.app.admin.DevicePolicyManager; 
import android.content.ComponentName; 

    DevicePolicyManager mDPM; 
    ComponentName mDeviceAdmin; 

On Tạo xác định phiên bản Android có và được xử lý trên các đối tượng

currentAPIVersion = Build.VERSION.SDK_INT; 

    if (currentAPIVersion >= android.os.Build.VERSION_CODES.FROYO) { 
     //2.2+ 
     mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE); 
     mDeviceAdmin = new ComponentName(this, WipeDataReceiver.class); 
    } 

Lớp WipeDataReceiver là một lớp học để thực hiện DeviceAdminReceiver, nhưng không có bất cứ ghi đè hoặc cập nhật mã.

public static class WipeDataReceiver extends DeviceAdminReceiver { 

    } 

Khi tiếp tục, ban đầu sẽ phải xác nhận Khôi phục cài đặt gốc. khi Activity trả về kết quả, nó sẽ thực hiện wipeData. Nếu đó là Froyo hoặc ít hơn, bạn có thể chuyển hoạt động đặt lại cài đặt gốc của nhà máy.

if (currentAPIVersion >= android.os.Build.VERSION_CODES.FROYO) { 
    // 2.2+ 
    if (!mDPM.isAdminActive(mDeviceAdmin)) { 
     Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); 
     intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdmin); 
     intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "Process will remove user installed applications, settings, wallpaper and sound settings. Are you sure you want to wipe device?"); 
     startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN); 
    } else { 
     // device administrator, can do security operations 
     mDPM.wipeData(0); 
    } 

} else { 
    // 2.1 
    try { 
     Context foreignContext = this.createPackageContext("com.android.settings", Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE); 
     Class<?> yourClass = foreignContext.getClassLoader().loadClass("com.android.settings.MasterClear"); 
     Intent i = new Intent(foreignContext, yourClass); 
     this.startActivityForResult(i, REQUEST_CODE_ENABLE_ADMIN); 
    } catch (ClassNotFoundException e) { 

    } 

} 
+0

"WipeDataReceiver" đề cập đến điều gì? – 130nk3r5

+0

'REQUEST_CODE_ENABLE_ADMIN' là gì? – ThomasW

+0

REQUEST_CODE_ENABLE_ADMIN là gì? – TapanHP

1

@TapanHP, Bạn chỉ có thể sử dụng bất kỳ ID nào để xử lý cuộc gọi kết quả hoạt động.

int REQUEST_CODE_ENABLE_ADMIN = 1234;

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