마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

보안암호 기능 통합에 문제가 있습니다!....

0 추천

제가 이번에 학교에서 프로젝트로 앱을 하나 만드는데 제가 보안암호 부분을 맡았습니다! 보안암호가 카카오톡 들어갈때 걸려지는 보안암호 기능을 맡았는데요! 제가 샘플 예제를 하나 받아서 구동해 봤는데 잘 돌아갔는데.... 저희가 개발중인 앱에 통합을 하니까 구동이 안되더군요 ㅠㅠ 로그캣을 읽어봐도 도대체 어디가 뭐때문에 문제인지 모르겠습니다 ㅠㅠ 

	private void updateUI() {
		Log.d("updatUI : "," 구문에 들어오긴 함 ㅇㅇ ");
		if (LockManager.getInstance().getAppLock().isPasscodeSet()) {
			Log.d("updatUI : "," 실행되고 반환값 참 ");
			btOnOff.setText(R.string.disable_passcode);
			btChange.setEnabled(true);
		} else {
			Log.d("updatUI : "," 실행되고 반환값 거짓 ");
			btOnOff.setText(R.string.enable_passcode);
			btChange.setEnabled(false);
		}
	}
}
public abstract class AppLock {
	public static final int ENABLE_PASSLOCK = 0;
	public static final int DISABLE_PASSLOCK = 1;
	public static final int CHANGE_PASSWORD = 2;
	public static final int UNLOCK_PASSWORD = 3;
	public static final String MESSAGE = "message";
	public static final String TYPE = "type";
	public static final int DEFAULT_TIMEOUT = 0; // 2000ms
	protected int lockTimeOut;
	protected HashSet<String> ignoredActivities;
	public void setTimeout(int timeout) {
		this.lockTimeOut = timeout;
	}
	public AppLock() {
		ignoredActivities = new HashSet<String>();
		lockTimeOut = DEFAULT_TIMEOUT;
	}

	public void addIgnoredActivity(Class<?> clazz) {
		String clazzName = clazz.getName();
		this.ignoredActivities.add(clazzName);
	}
	public void removeIgnoredActivity(Class<?> clazz) {
		String clazzName = clazz.getName();
		this.ignoredActivities.remove(clazzName);
	}
	public abstract void enable();
	public abstract void disable();
	public abstract boolean setPasscode(String passcode);
	public abstract boolean checkPasscode(String passcode);
	public abstract boolean isPasscodeSet();
}
public class AppLockImpl extends AppLock implements PageListener {
	public static final String TAG = "DefaultAppLock";
	private static final String PASSWORD_PREFERENCE_KEY = "passcode";
	private static final String PASSWORD_SALT = "7xn7@c$";
	private SharedPreferences settings;
	private int liveCount;
	private int visibleCount;
	private long lastActive;
	public AppLockImpl(Application app) {
		super();
		SharedPreferences settings = PreferenceManager
				.getDefaultSharedPreferences(app);
		this.settings = settings;
		this.liveCount = 0;
		this.visibleCount = 0;
	}

	public void enable() {
		LockBaseActivity.setListener(this);
	}

	public void disable() {
		LockBaseActivity.setListener(null);
	}

	public boolean checkPasscode(String passcode) {
		passcode = PASSWORD_SALT + passcode + PASSWORD_SALT;
		passcode = Encryptor.getSHA1(passcode);
		String storedPasscode = "";

		if (settings.contains(PASSWORD_PREFERENCE_KEY)) {
			storedPasscode = settings.getString(PASSWORD_PREFERENCE_KEY, "");
		}

		if (passcode.equalsIgnoreCase(storedPasscode)) {
			return true;
		} else {
			return false;
		}
	}

	public boolean setPasscode(String passcode) {
		SharedPreferences.Editor editor = settings.edit();

		if (passcode == null) {
			editor.remove(PASSWORD_PREFERENCE_KEY);
			editor.commit();
			this.disable();
		} else {
			passcode = PASSWORD_SALT + passcode + PASSWORD_SALT;
			passcode = Encryptor.getSHA1(passcode);
			editor.putString(PASSWORD_PREFERENCE_KEY, passcode);
			editor.commit();
			this.enable();
		}

		return true;
	}
	public boolean isPasscodeSet() {
		Log.d("isPasscodeSet : "," 이것도 구문에는 들온다; ;... ");
		if (settings.contains(PASSWORD_PREFERENCE_KEY)) {
			Log.d("ApploclImpl : "," 패스코드가 생성 됨 ");
			return true;
		}
		Log.d("ApploclImpl : "," 패스코드가 생성 안됨 ");
		return false;
	}

	private boolean isIgnoredActivity(Activity activity) {
		String clazzName = activity.getClass().getName();

		// ignored activities
		if (ignoredActivities.contains(clazzName)) {
			Log.d(TAG, "ignore activity " + clazzName);
			return true;
		}

		return false;
	}

	private boolean shouldLockSceen(Activity activity) {

		// already unlock
		if (activity instanceof AppLockActivity) {
			AppLockActivity ala = (AppLockActivity) activity;
			if (ala.getType() == AppLock.UNLOCK_PASSWORD) {
				Log.d(TAG, "already unlock activity");
				return false;
			}
		}

		// no pass code set
		if (!isPasscodeSet()) {
			Log.d(TAG, "lock passcode not set.");
			return false;
		}

		// no enough timeout
		long passedTime = System.currentTimeMillis() - lastActive;
		if (lastActive > 0 && passedTime <= lockTimeOut) {
			Log.d(TAG, "no enough timeout " + passedTime + " for "
					+ lockTimeOut);
			return false;
		}

		// start more than one page
		if (visibleCount > 1) {
			return false;
		}

		return true;
	}

	@Override
	public void onActivityPaused(Activity activity) {
		String clazzName = activity.getClass().getName();
		Log.d(TAG, "onActivityPaused " + clazzName);

		if (isIgnoredActivity(activity)) {
			return;
		}
	}

	@Override
	public void onActivityResumed(Activity activity) {
		String clazzName = activity.getClass().getName();
		Log.d(TAG, "onActivityResumed " + clazzName);

		if (isIgnoredActivity(activity)) {
			return;
		}

		if (shouldLockSceen(activity)) {
			Intent intent = new Intent(activity.getApplicationContext(),
					AppLockActivity.class);
			intent.putExtra(AppLock.TYPE, AppLock.UNLOCK_PASSWORD);
			intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			activity.getApplication().startActivity(intent);
		}

		lastActive = 0;
	}

	@Override
	public void onActivityCreated(Activity activity) {

		if (isIgnoredActivity(activity)) {
			return;
		}

		liveCount++;
	}

	@Override
	public void onActivityDestroyed(Activity activity) {
		if (isIgnoredActivity(activity)) {
			return;
		}

		liveCount--;
		if (liveCount == 0) {
			lastActive = System.currentTimeMillis();
			Log.d(TAG, "set last active " + lastActive);
		}
	}

	@Override
	public void onActivitySaveInstanceState(Activity activity) {
		if (isIgnoredActivity(activity)) {
			return;
		}
	}

	@Override
	public void onActivityStarted(Activity activity) {
		String clazzName = activity.getClass().getName();
		Log.d(TAG, "onActivityStarted " + clazzName);

		if (isIgnoredActivity(activity)) {
			return;
		}

		visibleCount++;
	}

	@Override
	public void onActivityStopped(Activity activity) {
		String clazzName = activity.getClass().getName();
		Log.d(TAG, "onActivityStopped " + clazzName);

		if (isIgnoredActivity(activity)) {
			return;
		}

		visibleCount--;
		if (visibleCount == 0) {
			lastActive = System.currentTimeMillis();
			Log.d(TAG, "set last active " + lastActive);
		}
	}
}

제가 알아보니까 LockManager.getinstance().getAppLock()까지는 실행이 된느데 AppLock부분의 isPassCodeSet 부분이 함수 자체가 실행이 안되더군요.... isPassCode뿐 아니라 AppLock의 모든 함수가 실행이 안됩니다. 혹시나 해서 AppLockImpl을 불러와서 실해해보아도 마찬가지입니다 ㅠㅠ 어떻게 방법이 없을까요?? 

익명사용자 님이 2015년 5월 24일 질문
글에 8천자 제한이 있어서 소스코드를 전부다 올리지는 못했구요.... 혹시 더 필요하시면 말씀해주세요!! 올리겠습니다 !!!.. ㅠㅠ

1개의 답변

0 추천
null point exception 이니 instance 부분 확인하세요
aucd29 (218,390 포인트) 님이 2015년 5월 26일 답변
...