2015-01-10 33 views
-1

我已經給我的應用程序的管理權限,現在我想監視沒有。使用DeviceAdminReceiver或BoradcastReceiver嘗試密碼嘗試失敗。有人可以提供代碼或幫助嗎? 另外,我應該在哪裏計算不。失敗的嘗試?在廣播課還是在接收課?請詳細解釋一下,如果可以的話。謝謝!如何計算no。密碼嘗試失敗並在密碼失敗時啓動另一項活動?

我的代碼:

MainActivity.java

包com.bew.locksmith;

import android.app.Activity; 
import android.app.admin.DevicePolicyManager; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 

public class MainActivity extends Activity implements OnClickListener { 


    int counter=0; 
    public int attempts=0; 

    private static final int ADMIN_INTENT = 15; 

    private static final String description = "Sample Administrator description"; 
    public static final String ACTION_PASSWORD_FAILED= "android.app.action.ACTION_PASSWORD_FAILED"; 
    private DevicePolicyManager mDevicePolicyManager, mDevicePolicyManager2; 
    private ComponentName mComponentName,mComponentName2; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mDevicePolicyManager = (DevicePolicyManager)getSystemService( 
       Context.DEVICE_POLICY_SERVICE); 
     mComponentName = new ComponentName(this, MyAdminReceiver.class); //MyadminReciever changed here 
     Button btnEnableAdmin = (Button) findViewById(R.id.btnEnable); 
     Button btnDisableAdmin = (Button) findViewById(R.id.btnDisable); 
     Button btnLock = (Button) findViewById(R.id.btnLock); 
     btnEnableAdmin.setOnClickListener(this); 
     btnDisableAdmin.setOnClickListener(this); 
     btnLock.setOnClickListener(this); 

    /* mDevicePolicyManager2 = (DevicePolicyManager)getSystemService( 
       Context.); */ 

    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
     case R.id.btnEnable: 
      Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); 
      intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mComponentName); 
      intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,description); 
      startActivityForResult(intent, ADMIN_INTENT); 
      break; 

     case R.id.btnDisable: 
      mDevicePolicyManager.removeActiveAdmin(mComponentName); 
      Toast.makeText(getApplicationContext(), "Admin registration removed", Toast.LENGTH_SHORT).show(); 
      break; 

     case R.id.btnLock: 
      boolean isAdmin = mDevicePolicyManager.isAdminActive(mComponentName); 
      if (isAdmin) { 
       mDevicePolicyManager.lockNow(); 
      }else{ 
       Toast.makeText(getApplicationContext(), "Not Registered as admin", Toast.LENGTH_SHORT).show(); 
      } 
      break; 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == ADMIN_INTENT) { 
      if (resultCode == RESULT_OK) { 
       Toast.makeText(getApplicationContext(), "Registered As Admin", Toast.LENGTH_SHORT).show(); 

      }else{ 
       Toast.makeText(getApplicationContext(), "Failed to register as Admin", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 

}

MyAdminReceiver.java

package com.bew.locksmith; 



import android.app.admin.DeviceAdminReceiver; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.preference.PreferenceManager; 
import android.widget.Toast; 

public class MyAdminReceiver extends DeviceAdminReceiver{ 





      private static final String KEY_ATTEMPTS_NO = "attempts_no"; 
      private static final int LIMIT = 3; 

      @Override 
      public void onPasswordFailed(Context context, Intent intent) { 
      SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); 
      int attempts = sharedPrefs.getInt(KEY_ATTEMPTS_NO, 0) + 1; 

      if (attempts == LIMIT) { 
       // Reset the counter 
       sharedPrefs.edit().putInt(KEY_ATTEMPTS_NO, 0).apply(); 

       // Launch your activity 
       context.startActivity(new Intent(context, test.class)); 
       Toast.makeText(context, "start activity", Toast.LENGTH_LONG).show(); 
      } else { 
       // Save the new attempts number 
       sharedPrefs.edit().putInt(KEY_ATTEMPTS_NO, attempts).apply(); 
      } 
      } 

      @Override 
      public void onPasswordSucceeded(Context context, Intent intent) { 
      // Reset number of attempts 
      SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); 
      sharedPrefs.edit().putInt(KEY_ATTEMPTS_NO, 0).apply(); 
      } 








    @Override 
    public void onReceive(Context arg0, Intent arg1) { 
     // TODO Auto-generated method stub 

     // TODO Auto-generated method stub 
     Toast.makeText(arg0, "here", Toast.LENGTH_LONG).show(); 

     /*Intent i = new Intent(); 
     i.setClassName("com.bew.locksmith","com.bew.locksmith.test"); 
     arg0.startActivity(i);*/ 

     //String action = arg1.getAction(); 


    } 




} 

test.java

package com.bew.locksmith; 

import android.app.Activity; 
import android.app.admin.DeviceAdminReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.widget.Toast; 

public class test extends Activity{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.test); 
    } 
} 

清單:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.bew.locksmith" 
    android:versionCode="1" 
    android:versionName="1.0"> 
    <uses-permission android:name="android.permission.CAMERA"/> 

    <uses-sdk 
     android:minSdkVersion="9" 
     android:targetSdkVersion="17" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.bew.locksmith.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <receiver 
      android:name="MyAdminReceiver" 
      android:permission="android.permission.BIND_DEVICE_ADMIN"> 
      <meta-data 
       android:name="android.app.device_admin" 
       android:resource="@xml/admin"/> 

      <intent-filter> 
       <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> 
      </intent-filter> 
     </receiver> 

     <activity 
      android:name="com.bew.locksmith.test" 
      android:label="@string/app_name" > 
      <category android:name="android.intent.category.DEFAULT" /> 

     </activity> 

    </application> 

</manifest> 

更新:添加了我的代碼,現在刪除那個-1,誰做了那個!

+0

爲了記錄在案,如果有誰在乎我還沒有得到任何解決方案,所以謝謝你的StackOverflow,非常感謝用戶@commonsware還有兩個我不能標籤的人,因爲這樣不允許我。 –

回答

0

CommonsWare's answer

您可以設置一個DeviceAdminReceiver,將被通知 密碼嘗試失敗,以及作爲一個成功的密碼嘗試 是一個失敗的嘗試後發生。這包括在the documentation of Android's device administration APIs

請注意,在您收到這些 事件之前,用戶必須同意允許您的應用通過設置應用作爲 設備管理員。

This sample project演示如何偵聽這些事件,再加上 設置密碼質量策略。關鍵件是:

你需要做的是改變DeviceAdminReceiver實現這樣:

public class AdminReceiver extends DeviceAdminReceiver { 
    @Override 
    public void onPasswordFailed(Context ctxt, Intent intent) { 
     DevicePolicyManager mgr = (DevicePolicyManager) ctxt.getSystemService(Context.DEVICE_POLICY_SERVICE); 
     int no = mgr.getCurrentFailedPasswordAttempts(); 

     if (no >= 3) { 
      context.startActivity(new Intent(context, MyActivity.class)); 
     } 
    } 
} 
+0

謝謝,回答但沒有任何反應,如果密碼輸入錯誤超過三次,我想打開一個只有一個字符串佈局的類,但沒有發生,這只是正常的。 –

+0

好的,說實話,我不確定你是否可以發起這樣的活動。但是讓我們測試一下邏輯,在'//啓動你的活動'後面加'Toast.makeText(context,「start activity」,Toast.LENGTH_LONG).show();'告訴我它是否顯示。 – aluxian

+0

此外,在Logcat中,我看到的第一個錯誤是標籤:文本中的「SurfaceFlinger」「ro.sf.lcd_density必須定義爲構建屬性」 –