2013-10-10 29 views
-1

希望有人能幫助我,因爲我一直堅持這幾天。我試圖在推送通知以指定關鍵字到達時遠程鎖定設備。否則,在通知中顯示消息。DevicePolicyManager鎖定不在一個活動

它正確顯示通知,但從不鎖定屏幕,當關鍵字發送時,什麼也沒有發生,沒有記錄。 我已確認字符串被正確讀取,因爲我之前將其設置爲顯示自定義通知,如果消息包含關鍵字。 該應用程序肯定有管理員權限,我可以鎖定屏幕使用相同的代碼內的活動...有什麼我需要做的才能讓這個工作在gcmintentsevice?

這裏是我的gcmintentservice代碼

package library; 


import com.test.LoginActivity; 
import com.test.R; 
import com.google.android.gms.gcm.GoogleCloudMessaging; 

import android.app.IntentService; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.app.admin.DevicePolicyManager; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.SystemClock; 
import android.support.v4.app.NotificationCompat; 
import android.util.Log; 


/** 
* This {@code IntentService} does the actual handling of the GCM message. 
* {@code GcmBroadcastReceiver} (a {@code WakefulBroadcastReceiver}) holds a 
* partial wake lock for this service while the service does its work. When the 
* service is finished, it calls {@code completeWakefulIntent()} to release the 
* wake lock. 
*/ 
public class GcmIntentService extends IntentService { 


    String messagereceived; 
    String Password = "LOCK"; 

    ComponentName mDeviceAdmin; 

    public static final int NOTIFICATION_ID = 1; 
    private DevicePolicyManager mDPM; 
    private NotificationManager mNotificationManager; 
    NotificationCompat.Builder builder; 

    public GcmIntentService() { 
     super("GcmIntentService"); 
    } 
    public static final String TAG = "test"; 

    @Override 
    protected void onHandleIntent(Intent intent) { 



     Bundle extras = intent.getExtras(); 

     GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); 
     // The getMessageType() intent parameter must be the intent you received 
     // in your BroadcastReceiver. 
     String messageType = gcm.getMessageType(intent); 

     if (!extras.isEmpty()) { // has effect of unparcelling Bundle 
      /* 
      * Filter messages based on message type. Since it is likely that GCM will be 
      * extended in the future with new message types, just ignore any message types you're 
      * not interested in, or that you don't recognize. 
      */ 
      if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { 
       sendNotification("Send error: " + extras.toString()); 
      } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) { 
       sendNotification("Deleted messages on server: " + extras.toString()); 
      // If it's a regular GCM message, do some work. 
      } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { 
       // This loop represents the service doing some work. 
       for (int i = 0; i < 5; i++) { 
        Log.i(TAG, "Working... " + (i + 1) 
          + "/5 @ " + SystemClock.elapsedRealtime()); 
        try { 
         Thread.sleep(5000); 
        } catch (InterruptedException e) { 
        } 
       } 
       Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime()); 

       // Post notification of received message. 
       messagereceived = extras.getString("message"); 

       if(messagereceived.equals("LOCK")){ 
        gcmaction(); 
       } 
       else{ 
        sendNotification("Message: " + extras.getString("message")); 
        Log.i(TAG, "Message: " + extras.toString()); 
       } 

      } 
     } 
     // Release the wake lock provided by the WakefulBroadcastReceiver. 
     GcmBroadcastReceiver.completeWakefulIntent(intent); 
    } 

    //lock method 
    private void gcmaction() { 

     mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 
     mDeviceAdmin = new ComponentName(this, AdminReceiver.class); 

     boolean active = mDPM.isAdminActive(mDeviceAdmin); 
     if (active) { 
     mDPM.resetPassword(Password,DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY); 
     mDPM.lockNow(); 

     } 
     else Log.i(TAG,"Not an admin"); 

    } 

    // Put the message into a notification and post it. 
    // This is just one simple example of what you might choose to do with 
    // a GCM message. 
    private void sendNotification(String msg) { 
     mNotificationManager = (NotificationManager) 
       this.getSystemService(Context.NOTIFICATION_SERVICE); 

     PendingIntent contentIntent = PendingIntent.getActivity(this, 0, 
       new Intent(this, LoginActivity.class), 0); 

     NotificationCompat.Builder mBuilder = 
       new NotificationCompat.Builder(this) 
     .setSmallIcon(R.drawable.ic_launcher) 
     .setContentTitle("ParentalKontrol") 
     .setStyle(new NotificationCompat.BigTextStyle() 
     .bigText(msg)) 
     .setContentText(msg); 

     mBuilder.setContentIntent(contentIntent); 
     mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); 
    } 
} 
+0

你是否把任何日誌放入'gcmaction()'如果這是調用或不。 –

+0

立即嘗試... – Gary

+0

好吧,我想我可能已經縮小了這個問題......我重建了AVD並再次嘗試,這次它鎖定了,但我只能讓它工作一次。看着日誌,我看到以下... 10-10 09:49:38.363:E/StrictMode(453):資源是在附加的堆棧跟蹤中獲取的,但從未釋放。有關避免資源泄漏的信息,請參見java.io.Closeable。10-10 09:49:38.363:E/StrictMode(453):java.lang.Throwable:顯式終止方法'close'不叫 – Gary

回答

0

你my_admin.xml下面包含?

<device-admin xmlns:android="http://schemas.android.com/apk/res/android" > 
    <uses-policies> 
     <force-lock /> 
    </uses-policies> 
</device-admin> 
+0

是的,我檢查了這一點,以確保我嘗試調用測試通知方法並顯示自定義字符串值。然後,我發送了一條帶有關鍵字的消息,並顯示了自定義消息,即:if語句是真的......其他任何消息都發送到sendnotification方法 – Gary

+0

當您收到通知時,設備已經是管理員了嗎?你確認了嗎? –

+0

添加一個日誌到方法,以確保它的調用... –