2013-01-11 24 views
0

我有活動,我正在使用http://code.google.com/p/android-lockpattern/這個庫模式設計的按鍵鎖定成功地鎖定在活動按鈕的屏幕。但是,當我實現一個服務在一段時間後在後臺執行相同的過程。KeyGuard鎖使用服務Android

的問題是,當我開始從活動服務進行鎖定功能,它不斷給我空指針

下面是我的主要活動的代碼。

package com.example.lockscreen_test; 

import group.pals.android.lib.ui.lockpattern.LockPatternActivity; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

    public class MainActivity extends Activity { 
private static final int _ReqCreatePattern = 0; 
// this is your preferred flag 
private static final int _ReqSignIn = 1; 
String pattern; 
public Button btn_show_lock; 
protected Object mHandler; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if (lockService.flag == false) { 
     CreateNewPattern(); 
    } 
    btn_show_lock = (Button) findViewById(R.id.button1); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

public void compare(View v) { 
    lockScreen(); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
    case _ReqCreatePattern: 
     if (resultCode == RESULT_OK) { 
      pattern = data.getStringExtra(LockPatternActivity._Pattern); 
      lockService.doNow = true; 
     } 
     break; 
    case _ReqSignIn: 
     if (resultCode == RESULT_OK) { 
      // signing in ok 
     } else { 
      // signing in failed 
     } 
     break; 
    } 
} 

public void lockScreen() { 
    // startService(new Intent(this, lockService.class)); 

    try { 
     Intent intent = new Intent(MainActivity.this, 
       LockPatternActivity.class); 
     intent.putExtra(LockPatternActivity._Mode, 
       LockPatternActivity.LPMode.ComparePattern); 
     intent.putExtra(LockPatternActivity._Pattern, pattern); 
     startActivityForResult(intent, _ReqSignIn); 
     Log.w("Locked", "ScreenLock"); 
    } catch (Exception e) { 
     Toast.makeText(this, e.getMessage().toString(), Toast.LENGTH_LONG) 
       .show(); 
    } 
} 

public void CreateNewPattern() { 
    // startService(new Intent(this, lockService.class)); 

    Intent intent = new Intent(MainActivity.this, LockPatternActivity.class); 
    intent.putExtra(LockPatternActivity._Mode, 
      LockPatternActivity.LPMode.CreatePattern); 
    startActivityForResult(intent, _ReqCreatePattern); 
    lockService.flag = true; 
    startService(new Intent(this, lockService.class)); 
} 

}

我的服務代碼

package com.example.lockscreen_test; 
import android.app.Notification; 
import android.app.PendingIntent; 
import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.util.Log; 
import java.util.Timer; 
import java.util.TimerTask; 

import com.example.lockscreen_test.R.drawable; 

public class lockService extends Service { 

MainActivity main; 

Notification _foregroundNotification; 

final int _notification_id = 1; 
public static Boolean flag = false; 
public static Boolean doNow = false; 

@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    main = new MainActivity(); 
    // main.CreateNewPattern(); 
    // startForeground(); 

    Log.w("created", "Services !"); 
    super.onCreate(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // TODO Auto-generated method stub 
    // main.lockScreen(); 
    if (doNow == true) { 
     RepeatProcess(); 
    } 
    return Service.START_REDELIVER_INTENT; 
} 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    Log.w("Destroyed", "Services destroyed!"); 
    super.onDestroy(); 
} 

void startForeground() { 

    int notificationIcon = drawable.ic_menu_chat_dashboard; 
    String notificiationTickerText = "Service Started..."; 
    long notificationTimestamp = System.currentTimeMillis(); 
    _foregroundNotification = new Notification(notificationIcon, 
      notificiationTickerText, notificationTimestamp); 
    String titletext = "Sample Service"; 
    String bodytext = "Does lock "; 

    Intent myactivity = new Intent(this, MainActivity.class); 
    PendingIntent startmyactivitypendingintent = PendingIntent.getActivity(
      this, 0, myactivity, 0); 
    _foregroundNotification.setLatestEventInfo(this, titletext, bodytext, 
      startmyactivitypendingintent); 
    startForeground(_notification_id, _foregroundNotification); 
} 

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

void RepeatProcess() { 
    int delay = 5000; // delay for 5 sec. 

    int period = 10000; // repeat every 10 sec. 

    Timer timer = new Timer(); 

    timer.scheduleAtFixedRate(new TimerTask() { 

     public void run() { 
      main.lockScreen(); 
      System.out.println("done"); 

     } 

    }, delay, period); 

} 

}

我menifest XML

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

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

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

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.lockscreen_test.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> 

    <service android:name=".lockService" > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </service> 

    <activity 
     android:name="group.pals.android.lib.ui.lockpattern.LockPatternActivity" 
     android:configChanges="orientation|screenSize|keyboard|keyboardHidden" /> 
</application> 

下面是我logcat的錯誤我不知道爲什麼它不斷給我空指針錯誤

AndroidRuntime(1683): FATAL EXCEPTION: Timer-001-11 08:29:31.689: 
AndroidRuntime(1683): java.lang.NullPointerException 
AndroidRuntime(1683): at com.example.lockscreen_test.MainActivity.lockScreen(MainActivity.java:75) 

AndroidRuntime(1683): at com.example.lockscreen_test.lockService$1.run(lockService.java:85) 

AndroidRuntime(1683): at java.util.Timer$TimerImpl.run(Timer.java:284) 
+0

line'MainActivity.java:75'上的代碼是什麼? –

+0

Pratik Sharma我正在使用意圖將值傳遞給我的模式鎖屏活動,其中我創建/匹配模式 –

+0

我發佈瞭解決方案,請嘗試一下,讓我知道是否顯示'模式爲null? –

回答

0

試圖改變自己的lockScreen()方法是這樣的:

public void lockScreen() { 
      // startService(new Intent(this, lockService.class)); 
      if(pattern != null){ 
       try { 
        Intent intent = new Intent(MainActivity.this, 
          LockPatternActivity.class); 
        intent.putExtra(LockPatternActivity._Mode, 
          LockPatternActivity.LPMode.ComparePattern); 
        intent.putExtra(LockPatternActivity._Pattern, pattern); 
        startActivityForResult(intent, _ReqSignIn); 
        Log.w("Locked", "ScreenLock"); 
       } catch (Exception e) { 

       } 
      } 
      else{ 
       Log.w("Locked", "Pattern Is Null here");      
      } 
} 

編輯:

更改M中的活動聲明anifest是這樣的:

<activity 
     android:name="com.example.lockscreen_test.MainActivity" 
     android:configChanges="orientation|keyboardHidden" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

謝謝。

+0

@ pratrik沙爾馬現在有這個問題/錯誤後執行您的代碼 –

+0

@AtabtabAli哪個錯誤/問題? –

+0

AndroidRuntime致命異常:Timer-0 AndroidRuntime java.lang.RuntimeException:無法在未調用Looper.prepare()的線程內創建處理程序AndroidRuntime(2502):at android.os.Handler。 (Handler.java:197) AndroidRuntime(2502):at android.os.Handler。 AndroidRuntime(2502):at android.widget.Toast $ TN。