2011-11-10 37 views
9

Tôi đang cố gắng tìm ra cách đánh thức và mở khóa điện thoại bằng dịch vụ. Tôi đã được đề cập đến this bài nhưng, tôi không thể tìm ra lý do tại sao nó không hoạt động. Đây là mã mà tôi có cho đến thời điểm này:Android: Wake & mở khóa điện thoại

public class WakephoneActivity extends Activity { 

    BroadcastReceiver mReceiver; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mReceiver = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       // Log.v(TAG, "Screen OFF onReceive()"); 
       screenOFFHandler.sendEmptyMessageDelayed(0, 2000); 
      } 
     }; 
    } 

    private Handler screenOFFHandler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 
      super.handleMessage(msg); 
      // do something 
      // wake up phone 
      // Log.i(TAG, "ake up the phone and disable keyguard"); 
      PowerManager powerManager = (PowerManager) WakephoneActivity.this 
        .getSystemService(Context.POWER_SERVICE); 
      long l = SystemClock.uptimeMillis(); 
      powerManager.userActivity(l, false);// false will bring the screen 
      // back as bright as it was, true - will dim it 
     } 
    }; 

    protected void onResume() { 
     super.onResume(); 
     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); 
     registerReceiver(mReceiver, filter); 
     // Log.i(TAG, "broadcast receiver registered!"); 
    } 
} 

Tôi cũng đã thêm mã trong tệp kê khai. Bất kỳ ý tưởng?

+0

Tôi nghĩ rằng bạn có thể gỡ bỏ cài đặt khóa bằng cách nào đó, vì vậy bạn có thể đánh thức điện thoại trực tiếp trên hoạt động của bạn. – njzk2

Trả lời

14

Sử dụng mã này bên dưới trong dịch vụ của bạn.

PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE); 
     mWakeLock = pm.newWakeLock((PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "YourServie"); 
     mWakeLock.acquire(); 
     [...] 
     mWakeLock.release(); 

Nếu bạn muốn mở khóa màn hình là tốt, đăng ký một máy thu trong dịch vụ của bạn theo dõi nếu màn hình được bật/tắt và nếu nó bị tắt và bạn muốn mở khóa điện thoại, bắt đầu một hoạt động với mã này trong onCreate:

Window window = getWindow(); 
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
this.finish(); 
return; 

tôi biết, đây là một thay bẩn, nhưng như xa như tôi biết, không có cách nào khác mở khóa lockscreen (và điều này sẽ chỉ làm việc nếu không có mật khẩu vv thiết lập, vì vậy nó phải là màn hình "trượt để mở khóa" bình thường).

Và đừng quên thêm android.permission.WAKE_LOCK ;-)

/chỉnh sửa: Tôi chỉ thấy bạn đang sử dụng một hoạt động. Nếu bạn có và không cần dịch vụ, chỉ cần đặt mã này vào hoạt động.

1

Đối với dịch vụ là allways hoạt động bạn cần phải có sự cho phép này trên manifest:

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

Một điều bạn cần phải làm là adquire một WakeLock. Nếu không có nó thì dịch vụ sẽ kết thúc sau một thời gian. Bạn có thể làm như sau:

getApplicationContext(); 
PowerManager pm = (PowerManager)getApplicationContext().getSystemService(Context.POWER_SERVICE); 
WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); 
wl.acquire(); 

Bạn có thể cần thay đổi PowerManager.PARTIAL_WAKE_LOCK thành cái bạn cần. Bạn có thể xem thông tin về điều đó here.

1

WakefulBroadcastReceiver thực hiện điều này cho bạn. sử dụng ví dụ:

import android.content.Context; 
import android.content.Intent; 
import android.os.SystemClock; 
import android.support.v4.content.WakefulBroadcastReceiver; 
import android.util.Log; 

public class SimpleWakefulReceiver extends WakefulBroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // This is the Intent to deliver to our service. 
     Intent service = new Intent(context, SimpleWakefulService.class); 

     // Start the service, keeping the device awake while it is launching. 
     Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime()); 
     startWakefulService(context, service); 
    } 
} 

Sau khi hoàn thành hành động trong dịch vụ, gọi SimpleWakefulReceiver.completeWakefulIntent(intent) để mở khóa trỗi dậy.

(như @Force đã đưa cho bạn các chi tiết về wakeLock, họ không cần phải được lặp đi lặp lại ở đây ;-)