0

これが契約です。私は主に次のことを行うシンプルなスクリーンロッカーアプリの作成に取り組んでいます:

  1. キーガードを削除します
  2. ホームボタンと戻るボタンを無効にします
  3. 画面がオフになった後にオンになるたびに実行されます
  4. 起動時に実行 [まだテストされていません]

私は宿題をして、たくさんのリンクを使用しました(特にstackoverflowで)、まだ多くの問題があります

番号1は完全に機能します:)

番号2は機能しますが、意図したとおりに機能しません。押すと、ユーザーにホームアプリケーションの選択を求めるダイアログが開きます...それは望ましくありません! ホームアプリではなく、ロック画面アプリを作りたい。(コードは最後に提供されます)

番号3は画面のロックを解除する前に機能しますが、その後、アプリケーションは自動的に起動する方法を知りません. ロック画面アクティビティの onCreat() メソッドのコードに登録されているブロードキャスト レシーバーを実装しました。これが問題だと思います:S

4位全然動かない!

サービスでテストしていましたが、まだ機能していません:'(


コード


マニフェスト正しいアクセス許可を使用していることは確かですよね?

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="himura.test.mylockertest"
    android:versionCode="1"
    android:versionName="1.0" >

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

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


    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" 
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen">

        <receiver 
            android:name=".EventsReciever"
            android:enabled="true" 
            android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.SCREEN_OFF"/>
                <action android:name="android.intent.action.SCREEN_ON"/>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

        <service 
            android:enabled="true"
            android:name=".UpdateService"/>

        <activity
            android:name=".LockPage"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>

</manifest>

アクティビティレイアウトは非常にシンプルで、ロックを解除するボタンは 1 つだけです :)

public class LockPage extends Activity {

    private Button ublockButton;

    @Override
    public void onAttachedToWindow() {
        //this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);     
        this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);   
        super.onAttachedToWindow();    
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ///** FIRST THINGS FIRST, START THE SERVICE **/
        //startService(new Intent(this, myService.class));

        /** REGISTERING RECEIVER **/        
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_BOOT_COMPLETED);
        BroadcastReceiver mReceiver = new EventsReciever();
        registerReceiver(mReceiver, filter);

        /** SETTING CONTENT VIEW**/
        setContentView(R.layout.lockscreen);

        /** REMOVING KEYGUARD RECEIVER **/
        KeyguardManager keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);
        KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
        lock.disableKeyguard();

        /** NORMAL CODE **/
        ublockButton = (Button)findViewById(R.id.bUnlock);
        ublockButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                finish();
            }
        });
    }

    @Override
    public void onBackPressed() {
        // Don't allow back to dismiss.
        return;
    }

    //only used in lockdown mode
    @Override
    protected void onPause() {
        super.onPause();
        Log.i("event","onPause");
        // Don't hang around.
        finish();
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("event","onStop");
        // Don't hang around.
        finish();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return false;
    }

}

ブロードキャスト レシーバーは、画面のオン/オフと起動の完了 (または完了すべき) の 3 つを処理します。ログでテストしてきました。

public class EventsReciever extends BroadcastReceiver {
//works before unlocking
//after unlocking, keygaurd still off, but receiver has stopped

    public static boolean wasScreenOn = true;
    @Override
    public void onReceive(Context context, Intent recievedIntent) {

        Log.i("Check","[BroadCastReciever] onRecieve()");

        if (recievedIntent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            wasScreenOn = false;
            Log.i("Check","[BroadCastReciever] Screen went OFF");
        } else if (recievedIntent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            wasScreenOn = true;
            Log.i("Check","[BroadCastReciever] Screen went ON");

            Intent intent = new Intent(context, LockPage.class);
            context.startActivity(intent);
        }
        else if(recievedIntent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
        {
            Intent intent = new Intent(context, LockPage.class);
            context.startActivity(intent);
        //  Intent intent = new Intent(context, LockPage.class);
        //  context.startActivity(intent);
        //  Intent serviceLauncher = new Intent(context, UpdateService.class);
        //  context.startService(serviceLauncher);
        //  Log.v("TEST", "Service loaded at start");
        }
    }

}

最後に、サービスは今は何もしません。初めてロックを解除した後、ロック画面を開始するために使用しようとしていました

public class myService extends Service{

    @Override
    public void onCreate() {

        /** INITIALIZE RECEIVER **/
        //RegisterReciever();

    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    // The standard pattern for implementing a Service is to create and run a new thread from onStartCommand 
    // to perform the processing in the background and stop the Service when it’s complete
        //RegisterReciever();

        return Service.START_STICKY;
    }

    /*private void RegisterReciever(){
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_BOOT_COMPLETED);
        BroadcastReceiver mReceiver = new EventsReciever();
        registerReceiver(mReceiver, filter);
    }*/

}

インターネットで見つけたその他の問題には、ネイティブキーガードで画面をオンにした後 (非常に悪い) ステータスバーが返されることが含まれます。ステータスバーはありますが、機能しません。それを行う方法はありますか? ?

ロッカーをアクティブにして、これをキーガードとして使用することをシステムに伝える方法はありませんか?

4

3 に答える 3

1

ロッカーをアクティブにして、これをキーガードとして使用することをシステムに伝える方法はありませんか?

独自のファームウェアを作成する場合、ほとんどのデバイス メーカーが行っていることを考えると、キーガードを別の実装に置き換える方法があると思われます。SDK を介してキーガードを置き換えることはできません。

于 2012-02-29T23:11:49.143 に答える
1

2番目の問題を解決するには(ホームアプリケーションからロックを削除します)AndroidManifest.xmlファイルから以下の行を削除します

< カテゴリ android:name="android.intent.category.HOME" />

于 2013-04-13T04:44:33.547 に答える
0

サービス:

BroadcastReceiver mReceiver=null;

int ReadingBlock = 100;
String PasswordType;

@Override
public void onCreate() {
    super.onCreate();

    // Register receiver that handles screen on and screen off logic
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    mReceiver = new AutoStart();
    registerReceiver(mReceiver, filter);

}

@Override
public void onStart(Intent intent, int startId) {

    boolean screenOn = false;

    try{
        // Get ON/OFF values sent from receiver ( AEScreenOnOffReceiver.java )
        screenOn = intent.getBooleanExtra("screen_state", false);

    }catch(Exception e){}

    if (!screenOn){

    } else {
           Intent RegularPassword = new Intent(getApplicationContext(), ScreenLock.class);
            RegularPassword.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            getApplicationContext().startActivity(RegularPassword);
        }
    }
}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onDestroy() {

    Log.i("ScreenOnOff", "Service  distroy");
    if(mReceiver!=null)
        unregisterReceiver(mReceiver);

}
于 2015-09-03T20:29:39.163 に答える