Android 短信加密,联系人字母侧边栏定位

// zj add part for Lock Msg start

public void zjSaveMsg(int threadId) {

String strId = Integer.toString(threadId);

// int count=0;

Uri uri = Uri.parse(“content://sms”);

// Uri uri, String[] projection, String selection,String[]

// selectionArgs, String sortOrder

String selection = “thread_id=?”;

String[] selectionArgs = new String[] { strId };

Cursor cur = this.managedQuery(uri, null, selection, selectionArgs,

null);

if (cur.moveToFirst()) {

do {

// for(int j = 0; j < cur.getColumnCount(); j++){

// String info = “name:” + cur.getColumnName(j) + “=” +

// cur.getString(j);

// Log.i(“====>”, info);

// }

// to zj DB start

MmsLockMsgDbHelper _db = new MmsLockMsgDbHelper(this);

int newMsgId = -1;

// long address = Long.parseLong(cur.getString(2));

// long date = Long.parseLong(cur.getString(4));

// int type = Integer.parseInt(cur.getString(9));

// String body = cur.getString(12);

int addressIndex = cur.getColumnIndex(“address”);

int dateIndex = cur.getColumnIndex(“date”);

int typeIndex = cur.getColumnIndex(“type”);

int bodyIndex = cur.getColumnIndex(“body”);

long address = Long.parseLong(cur.getString(addressIndex));

long date = Long.parseLong(cur.getString(dateIndex));

int type = Integer.parseInt(cur.getString(typeIndex));

String body = cur.getString(bodyIndex);

String phoneNum = Long.toString(address);

String name = getNameByNumber(phoneNum);

if (name != null && name.trim().length() > 0) {

MmsLockMsg newMsg = new MmsLockMsg(threadId, address, date,

type, body, name);

newMsgId = _db.addMsg(newMsg);

} else {

MmsLockMsg newMsg = new MmsLockMsg(threadId, address, date,

type, body, phoneNum);

newMsgId = _db.addMsg(newMsg);

}

// to zj DB end

} while (cur.moveToNext());

}

// delete from SystemDb start

this.getContentResolver().delete(Uri.parse(“content://sms”),

“thread_id=?”, new String[] { strId });

// delete from SystemDb end

Toast.makeText(this, com.android.mms.R.string.zj_lock_success,

Toast.LENGTH_SHORT).show();

finish();

// add for animation start

if (version > 5) {

overridePendingTransition(com.android.mms.R.anim.zj_right_in,

com.android.mms.R.anim.zj_right_out);

}

// add for animation end

}

短信收藏的代码顺便也贴一下吧,也是容易实现的,与加密相比少了一步,没有从系统数据库删掉,并且收藏只是收藏单条短信,而不是整个会话,所以接口要在短信条目长按的菜单里面添加:

case MENU_ADD_MARK:

int sms_id = (int) (mMsgItem.mMsgId);

Log.e(“SMS_ID”, “” + sms_id);

// Toast.makeText(this, “”+sms_id, 2).show();

zjSaveMark(sms_id);

return true;

public void zjSaveMark(int sms_id) {

MmsMarkMsgDbHelper _db2 = new MmsMarkMsgDbHelper(this);

// _db.onUpgrade(db, oldVersion, newVersion);

String strId = Integer.toString(sms_id);

int smsCount = 0;

try {

Cursor countCur = _db2.getAllMsgBySmsId(sms_id);

smsCount = countCur.getCount(); // zj:查看是否已经收藏

} catch (Exception e) {

// _db.onCreate(_db);

}

Log.e(“smsCount”, “” + smsCount);

if (smsCount > 0) {

Toast.makeText(this, com.android.mms.R.string.zj_already_marked,

Toast.LENGTH_SHORT).show();

} else {

// int count=0;

Uri uri = Uri.parse(“content://sms”);

// Uri uri, String[] projection, String selection,String[]

// selectionArgs, String sortOrder

String selection = “_id=?”;

String[] selectionArgs = new String[] { strId };

Cursor cur = this.managedQuery(uri, null, selection, selectionArgs,

null);

if (cur.moveToFirst()) {

do {

// to zj DB start

int newMsgId = -1;

int addressIndex = cur.getColumnIndex(“address”);

int dateIndex = cur.getColumnIndex(“date”);

int typeIndex = cur.getColumnIndex(“type”);

int bodyIndex = cur.getColumnIndex(“body”);

long address = Long.parseLong(cur.getString(addressIndex));

long date = Long.parseLong(cur.getString(dateIndex));

int type = Integer.parseInt(cur.getString(typeIndex));

String body = cur.getString(bodyIndex);

MmsMarkMsg newMsg = new MmsMarkMsg(sms_id, address, date,

type, body);

newMsgId = _db2.addMsg(newMsg);

// to zj DB end

} while (cur.moveToNext());

}

Toast.makeText(this, com.android.mms.R.string.zj_mark_success,

Toast.LENGTH_SHORT).show();

}

}

查看加密的短信需要进入到一个List,进入之前需要进行身份验证。

如果是第一次进入,之前没有设置过九宫格手势密码,就提示用户设置,第一次绘制和第二次绘制图案相同,设置手势密码成功,然后提示用户设置字符密保,用于忘记手势密码时进行重置。

验证身份页面:

/*

  • ZJ add for Mms Lock

*/

package com.android.mms.ui;

import java.util.Random;

import android.os.Bundle;

import android.app.Activity;

import android.content.Intent;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.view.Window;

import android.widget.LinearLayout;

import android.widget.TextView;

import android.widget.Toast;

import android.app.ActionBar; //zj add for actionBar back

public class MmsLock extends Activity {

private LinearLayout nine_con;

MmsLockSetPwd setPwd;

MmsLockCheckPwd checkPwd;

TextView showInfo;

boolean isSetFirst = false;

public int version = Integer.valueOf(android.os.Build.VERSION.SDK);

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// this.requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(com.android.mms.R.layout.mms_lock);

showInfo = (TextView) findViewById(com.android.mms.R.id.show_set_info);

nine_con = (LinearLayout) findViewById(com.android.mms.R.id.nine_con);

SharedPreferences shareDate = getSharedPreferences(“GUE_PWD”, 0);

String pwd = shareDate.getString(“GUE_PWD”, “HAVE NO PWD !”);

boolean is_set = shareDate.getBoolean(“IS_SET”, false);

if (is_set) {

TextView tv_forget_pwd = (TextView) findViewById(com.android.mms.R.id.zj_lock_forget_pwd);

checkPwd = new MmsLockCheckPwd(MmsLock.this);

nine_con.addView(checkPwd);

tv_forget_pwd.setVisibility(View.VISIBLE);

checkPwd();

} else {

TextView tv_forget_pwd = (TextView) findViewById(com.android.mms.R.id.zj_lock_forget_pwd);

setPwd = new MmsLockSetPwd(MmsLock.this);

nine_con.addView(setPwd);

tv_forget_pwd.setVisibility(View.GONE);

getSetPwd();

}

// zj:for action back start

ActionBar actionBar = getActionBar();

actionBar.setHomeButtonEnabled(true);

actionBar.setDisplayHomeAsUpEnabled(true);

actionBar.setDisplayShowHomeEnabled(true);

// zj:for action bar end

}

public void checkPwd() {

showInfo.setText(com.android.mms.R.string.zj_check_pwd);

SharedPreferences shareDate = getSharedPreferences(“GUE_PWD”, 0);

}

public void getSetPwd() {

SharedPreferences shareDate = getSharedPreferences(“GUE_PWD”, 0);

isSetFirst = shareDate.getBoolean(“IS_SET_FIRST”, false);

if (!isSetFirst) {

showInfo.setText(com.android.mms.R.string.zj_set_pwd);

shareDate.edit().clear().commit();

} else {

showInfo.setText(com.android.mms.R.string.zj_confirm_pwd);

}

boolean is_second_error = shareDate.getBoolean(“SECOND_ERROR”, false);

if (is_second_error) {

showInfo.setText(com.android.mms.R.string.zj_reinput_pwd);

shareDate.edit().clear().commit();

}

}

// zj actionBar Menu start

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(com.android.mms.R.menu.mms_lock, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

case android.R.id.home:

finish();

// add for animation start

if (version > 5) {

overridePendingTransition(com.android.mms.R.anim.zj_right_in,

com.android.mms.R.anim.zj_right_out);

}

// add for animation end

break;

// case com.android.mms.R.id.zj_reset_pwd:

// Intent intent = new Intent(this,

// com.android.mms.ui.MmsLockResetPwd.class);

// startActivity(intent);

// break;

default:

// return super.onOptionsItemSelected(item);

break;

}

return true;

}

// zj actionBar menu end

public void zjForgetPwd(View v) {

Intent intent = new Intent(this,

com.android.mms.ui.MmsLockResetPwd.class);

startActivity(intent);

}

}

加密短信的DbHelper:

/*

  • ZJ add for Mms Lock

*/

package com.android.mms.ui;

import java.util.ArrayList;

import java.util.List;

import android.content.ContentValues;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

public class MmsLockMsgDbHelper extends SQLiteOpenHelper {

private static final int DATABASE_VERSION = 3;

private static final String DATABASE_NAME = “zj_msg”;

private static final String NOTE_TABLE_NAME = “msg”;

private static final String NOTE_COL_ID = “_id”;

private static final String NOTE_COL_THREAD_ID = “thread_id”;

private static final String NOTE_COL_ADDRESS = “address”;

private static final String NOTE_COL_DATE = “date”;

private static final String NOTE_COL_TYPE = “type”;

private static final String NOTE_COL_BODY = “body”;

private static final String NOTE_COL_NAME = “name”;

private static final String[] NOTE_COL_PROJECTION = new String[] {

NOTE_COL_ID, NOTE_COL_THREAD_ID, NOTE_COL_ADDRESS, NOTE_COL_DATE,

NOTE_COL_TYPE, NOTE_COL_BODY, NOTE_COL_NAME };

public MmsLockMsgDbHelper(Context context) {

super(context, DATABASE_NAME, null, DATABASE_VERSION);

}

// Create table

@Override

public void onCreate(SQLiteDatabase db) {

String createNOTETableSql = “CREATE TABLE " + NOTE_TABLE_NAME + " (”

  • NOTE_COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"

  • NOTE_COL_THREAD_ID + " INTEGER," + NOTE_COL_ADDRESS

  • " INTEGER," + NOTE_COL_DATE + " INTEGER," + NOTE_COL_TYPE

  • " INTEGER," + NOTE_COL_BODY + " TEXT," + NOTE_COL_NAME

  • " TEXT" + “);”;

db.execSQL(createNOTETableSql);

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

// Drop older table if existed

db.execSQL("DROP TABLE IF EXISTS " + NOTE_TABLE_NAME);

// Create tables again

onCreate(db);

}

// Add new Msg

public int addMsg(MmsLockMsg Msg) {

SQLiteDatabase db = this.getWritableDatabase();

ContentValues values = new ContentValues();

values.put(NOTE_COL_THREAD_ID, Msg.getThreadId());

values.put(NOTE_COL_ADDRESS, Msg.getAddress());

values.put(NOTE_COL_DATE, Msg.getDate());

values.put(NOTE_COL_TYPE, Msg.getType());

values.put(NOTE_COL_BODY, Msg.getBody());

values.put(NOTE_COL_NAME,Msg.getName());

// Insert to database

long rowId = db.insert(NOTE_TABLE_NAME, null, values);

// Close the database

db.close();

return (int) rowId;

}

// Get one NOTE

public MmsLockMsg getMsg(int id) {

SQLiteDatabase db = this.getReadableDatabase();

Cursor cursor = db.query(NOTE_TABLE_NAME, NOTE_COL_PROJECTION,

NOTE_COL_ID + “=?”, new String[] { String.valueOf(id) }, null,

null, null, null);

if (cursor != null)

cursor.moveToFirst();

MmsLockMsg msg = new MmsLockMsg(cursor.getInt(0), cursor.getInt(1),

cursor.getLong(2), cursor.getLong(3), cursor.getInt(4),

cursor.getString(5),cursor.getString(6));

return msg;

}

public int getThreadIdById(int id) {

SQLiteDatabase db = this.getReadableDatabase();

Cursor cursor = db.query(NOTE_TABLE_NAME, NOTE_COL_PROJECTION,

NOTE_COL_ID + “=?”, new String[] { String.valueOf(id) }, null,

null, null, null);

if (cursor != null)

cursor.moveToFirst();

int threadId = cursor.getInt(1);

return threadId;

}

// Get all Msg

public List getAllMsg() {

List MsgList = new ArrayList();

String selectQuery = "SELECT * FROM " + NOTE_TABLE_NAME;

SQLiteDatabase db = this.getWritableDatabase();

Cursor cursor = db.rawQuery(selectQuery, null);

// looping through all rows and adding to list

if (cursor.moveToFirst()) {

do {

MmsLockMsg Msg = new MmsLockMsg(cursor.getInt(0),

cursor.getInt(1), cursor.getLong(2), cursor.getLong(3),

cursor.getInt(4), cursor.getString(5),cursor.getString(6));

MsgList.add(Msg);

} while (cursor.moveToNext());

}

// return contact list

return MsgList;

}

public Cursor getAllMsgCursor() {

String selectQuery = "SELECT * FROM " + NOTE_TABLE_NAME;

SQLiteDatabase db = this.getReadableDatabase();

Cursor cursor = db.rawQuery(selectQuery, null);

return cursor;

}

public Cursor getAllMsgCursorGroupByThreadId() {

String selectQuery = “SELECT * FROM msg WHERE _id in (select min(_id)from msg group by thread_id)”;

SQLiteDatabase db = this.getReadableDatabase();

Cursor cursor = db.rawQuery(selectQuery, null);

return cursor;

}

// 更改电话号码为联系人名字,若存在

// public Cursor

public Cursor getAllMsgByThreadId(int threadId) {

String selectQuery = “SELECT * FROM msg WHERE thread_id =” + threadId

  • " order by date";

SQLiteDatabase db = this.getReadableDatabase();

Cursor cursor = db.rawQuery(selectQuery, null);

return cursor;

}

public int updateMsg(MmsLockMsg msg) {

SQLiteDatabase db = this.getWritableDatabase();

ContentValues values = new ContentValues();

values.put(NOTE_COL_THREAD_ID, msg.getThreadId());

values.put(NOTE_COL_ADDRESS, msg.getAddress());

values.put(NOTE_COL_DATE, msg.getDate());

values.put(NOTE_COL_TYPE, msg.getType());

values.put(NOTE_COL_BODY, msg.getBody());

values.put(NOTE_COL_NAME, msg.getName());

return db.update(NOTE_TABLE_NAME, values, NOTE_COL_ID + “=?”,

new String[] { String.valueOf(msg.getId()) });

}

public void deleteMsg(int id) {

SQLiteDatabase db = this.getWritableDatabase();

db.delete(NOTE_TABLE_NAME, NOTE_COL_ID + “=?”,

new String[] { String.valueOf(id) });

db.close();

}

public void deleteMsgByThreadId(int threadId) { // NOTE_COL_ID改为NOTE_COL_THREAD_ID

SQLiteDatabase db = this.getWritableDatabase();

db.delete(NOTE_TABLE_NAME, NOTE_COL_THREAD_ID + “=?”,

new String[] { String.valueOf(threadId) });

db.close();

}

public void deleteAllMsg() {

SQLiteDatabase db = this.getWritableDatabase();

db.delete(NOTE_TABLE_NAME, null, null);

db.close();

}

}

文件有些多,今天就先到这儿吧,明天再续。有不明白的地方欢迎交流。

洗衣机坏了,有时候按一会儿就可以启动了,今天怎么弄都没效果,大概是启动电容的问题吧,悲剧。

下午去看公司部门间的球赛,我们队再胜一局,维持不败战绩,作为拉拉队员还是很开心的。

今天接着昨天的内容开始~

哎呀,代码在公司,明天再补充。先去学习。

Mms类:

/*

  • ZJ add for Mms Lock

*/

package com.android.mms.ui;

public class MmsLockMsg {

int _id;

int thread_id; // 号码区分标识

long address; // 号码

long date; // 日期

int type;//信息类型

// long date_sent; // 发送日期

String body; // 短信内容

String name;

public MmsLockMsg(int id, int thread_id, long address, long date,int type,String body,String name) {

this._id = id;

this.thread_id = thread_id;

this.address = address;

this.date = date;

this.type =type;

this.body = body;

this.name = name;

}

public MmsLockMsg(int thread_id, long address, long date,int type, String body,String name) {

this.thread_id = thread_id;

this.address = address;

this.date = date;

this.type =type;

this.body = body;

this.name = name;

}

public int getId() {

return _id;

}

public int getThreadId() {

return thread_id;

}

public void setThreadId(int thread_id) {

this.thread_id = thread_id;

}

public long getAddress() {

return address;

}

public void setAddress(long address) {

this.address = address;

}

public long getDate() {

return date;

}

public void setDate(long date) {

this.date = date;

}

public int getType(){

return type;

}

public void setType(int type){

this.type=type;

}

public String getBody() {

return body;

}

public void setBody(String body) {

this.body = body;

}

public String getName(){

return name;

}

public void setName(String name){

this.name = name;

}

}

设置手势密码页:

/*

  • ZJ add for Mms Lock

*/

package com.android.mms.ui;

import android.app.Activity;

import android.content.Context;

import android.content.Intent;

import android.content.SharedPreferences;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Paint.Style;

import android.graphics.Typeface;

import android.graphics.Paint.Cap;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.widget.TextView;

public class MmsLockSetPwd extends View {

TextView tv_forget_pwd = (TextView)findViewById(com.android.mms.R.id.zj_lock_forget_pwd);

Paint linePaint = new Paint();

Paint whiteLinePaint = new Paint();

Paint textPaint = new Paint();

Bitmap defaultBitmap = BitmapFactory.decodeResource(getResources(),

com.android.mms.R.drawable.lock);

int defaultBitmapRadius = defaultBitmap.getWidth() / 2;

Bitmap selectedBitmap = BitmapFactory.decodeResource(getResources(),

com.android.mms.R.drawable.indicator_lock_area);

int selectedBitmapDiameter = selectedBitmap.getWidth();

int selectedBitmapRadius = selectedBitmapDiameter / 2;

PointInfo[] points = new PointInfo[9];

PointInfo startPoint = null;

int width, height;

int moveX, moveY;

boolean isUp = false;

Context ctx;

StringBuffer lockString = new StringBuffer();

public MmsLockSetPwd(Context context) {

super(context);

ctx = context;

// this.setBackgroundColor(Color.WHITE);

initPaint();

}

public MmsLockSetPwd(Context context, AttributeSet attrs) {

super(context, attrs);

// this.setBackgroundColor(Color.WHITE);

tv_forget_pwd.setVisibility(View.GONE); //zj add

initPaint();

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

width = getWidth();

height = getHeight();

if (width != 0 && height != 0) {

initPoints(points);

}

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

@Override

protected void onLayout(boolean changed, int left, int top, int right,

int bottom) {

super.onLayout(changed, left, top, right, bottom);

}

private int startX = 0, startY = 0;

@Override

protected void onDraw(Canvas canvas) {

// canvas.drawText(“passwd:” + lockString, 0, 40, textPaint);

if (moveX != 0 && moveY != 0 && startX != 0 && startY != 0) {

// drawLine(canvas, startX, startY, moveX, moveY);

}

drawNinePoint(canvas);

super.onDraw(canvas);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

boolean flag = true;

if (isUp) {

finishDraw();

flag = false;

} else {

handlingEvent(event);

flag = true;

}

return flag;

}

private void handlingEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_MOVE:

moveX = (int) event.getX();

moveY = (int) event.getY();

for (PointInfo temp : points) {

if (temp.isInMyPlace(moveX, moveY)

&& temp.isSelected() == false) {

temp.setSelected(true);

startX = temp.getCenterX();

startY = temp.getCenterY();

int len = lockString.length();

if (len != 0) {

int preId = lockString.charAt(len - 1) - 48;

points[preId].setNextId(temp.getId());

}

lockString.append(temp.getId());

break;

}

}

invalidate(0, height - width, width, height);

break;

case MotionEvent.ACTION_DOWN:

int downX = (int) event.getX();

int downY = (int) event.getY();

for (PointInfo temp : points) {

if (temp.isInMyPlace(downX, downY)) {

temp.setSelected(true);

startPoint = temp;

startX = temp.getCenterX();

startY = temp.getCenterY();

lockString.append(temp.getId());

break;

}

}

invalidate(0, height - width, width, height);

break;

case MotionEvent.ACTION_UP:

startX = startY = moveX = moveY = 0;

isUp = true;

invalidate();

savePwd();

break;

default:

break;

}

}

private void finishDraw() {

for (PointInfo temp : points) {

temp.setSelected(false);

temp.setNextId(temp.getId());

}

lockString.delete(0, lockString.length());

isUp = false;

invalidate();

}

private void initPoints(PointInfo[] points) {

int len = points.length;

int seletedSpacing = (width - selectedBitmapDiameter * 3) / 4;

int seletedX = seletedSpacing;

int seletedY = height - width + seletedSpacing;

int defaultX = seletedX + selectedBitmapRadius - defaultBitmapRadius;

int defaultY = seletedY + selectedBitmapRadius - defaultBitmapRadius;

for (int i = 0; i < len; i++) {

if (i == 3 || i == 6) {

seletedX = seletedSpacing;

seletedY += selectedBitmapDiameter + seletedSpacing;

defaultX = seletedX + selectedBitmapRadius

  • defaultBitmapRadius;

defaultY += selectedBitmapDiameter + seletedSpacing;

}

points[i] = new PointInfo(i, defaultX, defaultY, seletedX, seletedY);

seletedX += selectedBitmapDiameter + seletedSpacing;

defaultX += selectedBitmapDiameter + seletedSpacing;

}

}

private void initPaint() {

initLinePaint(linePaint);

initTextPaint(textPaint);

initWhiteLinePaint(whiteLinePaint);

}

/**

  • @param paint

*/

private void initTextPaint(Paint paint) {

textPaint.setTextSize(30);

textPaint.setAntiAlias(true);

textPaint.setTypeface(Typeface.MONOSPACE);

}

/**

  • @param paint

*/

private void initLinePaint(Paint paint) {

//paint.setColor(Color.GRAY);

paint.setColor(Color.parseColor(“#1E90FF”));

//paint.setStyle(Style.STROKE);

paint.setStyle(Style.FILL);

paint.setStrokeWidth(10);

paint.setAntiAlias(true);

paint.setStrokeCap(Cap.ROUND);

}

/**

  • @param paint

*/

private void initWhiteLinePaint(Paint paint) {

//paint.setColor(Color.WHITE);

paint.setColor(Color.parseColor(“#1E90FF”));

paint.setStrokeWidth(8);

paint.setAntiAlias(true);

paint.setStrokeCap(Cap.ROUND);

}

/**

  • @param canvas

*/

private void drawNinePoint(Canvas canvas) {

if (startPoint != null) {

drawEachLine(canvas, startPoint);

}

for (PointInfo pointInfo : points) {

if (pointInfo != null) {

if (pointInfo.isSelected()) {

canvas.drawBitmap(selectedBitmap, pointInfo.getSeletedX(),

pointInfo.getSeletedY(), null);

}else{ // zj add

canvas.drawBitmap(defaultBitmap, pointInfo.getDefaultX(),

pointInfo.getDefaultY(), null);

}

}

}

}

/**

  • @param canvas

  • @param point

*/

private void drawEachLine(Canvas canvas, PointInfo point) {

if (point.hasNextId()) {

int n = point.getNextId();

drawLine(canvas, point.getCenterX(), point.getCenterY(),

points[n].getCenterX(), points[n].getCenterY());

drawEachLine(canvas, points[n]);

}

}

/**

  • @param canvas

  • @param startX

  • @param startY

  • @param stopX

  • @param stopY

*/

private void drawLine(Canvas canvas, float startX, float startY,

float stopX, float stopY) {

canvas.drawLine(startX, startY, stopX, stopY, linePaint);

canvas.drawLine(startX, startY, stopX, stopY, whiteLinePaint);

}

/**

  • @author zkwlx

*/

private class PointInfo {

private int id;

private int nextId;

private boolean selected;

private int defaultX;

private int defaultY;

private int seletedX;

private int seletedY;

public PointInfo(int id, int defaultX, int defaultY, int seletedX,

int seletedY) {

this.id = id;

this.nextId = id;

this.defaultX = defaultX;

this.defaultY = defaultY;

this.seletedX = seletedX;

this.seletedY = seletedY;

}

public boolean isSelected() {

return selected;

}

public void setSelected(boolean selected) {

this.selected = selected;

}

public int getId() {

return id;

}

public int getDefaultX() {

return defaultX;

}

public int getDefaultY() {

return defaultY;

}

public int getSeletedX() {

return seletedX;

}

public int getSeletedY() {

return seletedY;

}

public int getCenterX() {

return seletedX + selectedBitmapRadius;

}

public int getCenterY() {

return seletedY + selectedBitmapRadius;

}

public boolean hasNextId() {

return nextId != id;

}

public int getNextId() {

return nextId;

}

public void setNextId(int nextId) {

this.nextId = nextId;

}

/**

  • @param x

  • @param y

*/

public boolean isInMyPlace(int x, int y) {

boolean inX = x > seletedX

&& x < (seletedX + selectedBitmapDiameter);

boolean inY = y > seletedY

&& y < (seletedY + selectedBitmapDiameter);

return (inX && inY);

}

}

public String getPwd() {

return lockString.toString();

}

public void savePwd() {

Intent intent = new Intent();

SharedPreferences shareDate = ctx.getSharedPreferences(“GUE_PWD”, 0);

boolean isSetFirst = shareDate.getBoolean(“IS_SET_FIRST”, false);

if (isSetFirst) {

String pwd = this.getPwd();

String first_pwd = shareDate.getString(“FIRST_PWD”, “HAVE NO PWD”);

if (pwd.equals(first_pwd)) {

shareDate.edit().clear().commit();

shareDate.edit().putBoolean(“IS_SET”, true).commit();

shareDate.edit().putString(“GUE_PWD”, pwd).commit();

intent.setClass(ctx, MmsLockSetPwdOk.class);

} else {

shareDate.edit().putBoolean(“SECOND_ERROR”, true).commit();

intent.setClass(ctx, MmsLock.class);

}

} else {

shareDate.edit().clear().commit();

shareDate.edit().putString(“FIRST_PWD”, this.getPwd()).commit();

shareDate.edit().putBoolean(“IS_SET_FIRST”, true).commit();

intent.setClass(ctx, MmsLock.class);

}

ctx.startActivity(intent);

((Activity) ctx).finish();

}

}

手势密码设置成功后,让用户输入字符密保,以防遗忘手势密码:

/*

  • ZJ add for Mms Lock

*/

package com.android.mms.ui;

import android.app.Activity;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

import android.os.Bundle;

import android.view.View;

import android.view.Window;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

public class MmsLockSetPwdOk extends Activity {

//private TextView showInfo;

private EditText secondPwd;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

//this.requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(com.android.mms.R.layout.mms_lock_res);

//showInfo = (TextView)findViewById(com.android.mms.R.id.res_info);

//SharedPreferences shareDate = getSharedPreferences(“GUE_PWD”, 0);

//String pwd = shareDate.getString(“GUE_PWD”, “HAVE NO PWD !”);

// showInfo.setText("密码是: "+pwd);

//showInfo.setText(com.android.mms.R.string.zj_set_pwd_tip);

}

public void saveSecondPwd(View v){

secondPwd = (EditText)findViewById(com.android.mms.R.id.second_pwd);

String secondStr = secondPwd.getText().toString();

if(secondStr!= null && secondStr.trim().length() != 0){

//获取SharedPreferences对象

// Context ctx = MainActivity.this;

SharedPreferences secondShare = getSharedPreferences(“SECOND_PWD”, MODE_PRIVATE);

//存入数据

Editor editor = secondShare.edit();

editor.putString(“SECOND_KEY”, secondStr);

editor.putBoolean(“SECOND_IS_SET”, true);

editor.commit();

Toast.makeText(this, com.android.mms.R.string.zj_set_pwd_success, Toast.LENGTH_SHORT).show();

finish();

}else{

Toast.makeText(this, com.android.mms.R.string.zj_pwd_null, Toast.LENGTH_SHORT).show();

}

}

}

MmsLockCheckPwd.java:

/*

  • ZJ add for Mms Lock

*/

package com.android.mms.ui;

import android.app.Activity;

import android.content.Context;

import android.content.Intent;

import android.content.SharedPreferences;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Typeface;

import android.graphics.Paint.Cap;

import android.graphics.Paint.Style;

//import android.os.Vibrator; // zj Cancel

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.widget.TextView;

public class MmsLockCheckPwd extends View {

TextView tv_forget_pwd = (TextView) findViewById(com.android.mms.R.id.zj_lock_forget_pwd);

Paint linePaint = new Paint();

Paint whiteLinePaint = new Paint();

Paint textPaint = new Paint();

Bitmap defaultBitmap = BitmapFactory.decodeResource(getResources(),

com.android.mms.R.drawable.lock);

int defaultBitmapRadius = defaultBitmap.getWidth() / 2;

Bitmap selectedBitmap = BitmapFactory.decodeResource(getResources(),

com.android.mms.R.drawable.indicator_lock_area);

int selectedBitmapDiameter = selectedBitmap.getWidth();

int selectedBitmapRadius = selectedBitmapDiameter / 2;

PointInfo[] points = new PointInfo[9];

PointInfo startPoint = null;

int width, height;

int moveX, moveY;

boolean isUp = false;

Context ctx;

StringBuffer lockString = new StringBuffer();

public MmsLockCheckPwd(Context context) {

super(context);

ctx = context;

// this.setBackgroundColor(Color.WHITE);

initPaint();

}

public MmsLockCheckPwd(Context context, AttributeSet attrs) {

super(context, attrs);

// this.setBackgroundColor(Color.WHITE);

tv_forget_pwd.setVisibility(View.VISIBLE); // zj add

initPaint();

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

width = getWidth();

height = getHeight();

if (width != 0 && height != 0) {

initPoints(points);

}

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

@Override

protected void onLayout(boolean changed, int left, int top, int right,

int bottom) {

super.onLayout(changed, left, top, right, bottom);

}

private int startX = 0, startY = 0;

@Override

protected void onDraw(Canvas canvas) {

// canvas.drawText(“passwd:” + lockString, 0, 40, textPaint);

if (moveX != 0 && moveY != 0 && startX != 0 && startY != 0) {

// drawLine(canvas, startX, startY, moveX, moveY);

}

drawNinePoint(canvas);

super.onDraw(canvas);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

boolean flag = true;

if (isUp) {

finishDraw();

flag = false;

} else {

handlingEvent(event);

flag = true;

}

return flag;

}

private void handlingEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_MOVE:

moveX = (int) event.getX();

moveY = (int) event.getY();

for (PointInfo temp : points) {

if (temp.isInMyPlace(moveX, moveY)

&& temp.isSelected() == false) {

temp.setSelected(true);

startX = temp.getCenterX();

startY = temp.getCenterY();

int len = lockString.length();

if (len != 0) {

int preId = lockString.charAt(len - 1) - 48;

points[preId].setNextId(temp.getId());

}

lockString.append(temp.getId());

break;

}

}

invalidate(0, height - width, width, height);

break;

case MotionEvent.ACTION_DOWN:

int downX = (int) event.getX();

int downY = (int) event.getY();

for (PointInfo temp : points) {

if (temp.isInMyPlace(downX, downY)) {

temp.setSelected(true);

startPoint = temp;

startX = temp.getCenterX();

startY = temp.getCenterY();

lockString.append(temp.getId());

break;

}

}

invalidate(0, height - width, width, height);

break;

case MotionEvent.ACTION_UP:

startX = startY = moveX = moveY = 0;

isUp = true;

invalidate();

savePwd();

break;

default:

break;

}

}

private void finishDraw() {

for (PointInfo temp : points) {

temp.setSelected(false);

temp.setNextId(temp.getId());

}

lockString.delete(0, lockString.length());

isUp = false;

invalidate();

}

private void initPoints(PointInfo[] points) {

int len = points.length;

int seletedSpacing = (width - selectedBitmapDiameter * 3) / 4;

int seletedX = seletedSpacing;

int seletedY = height - width + seletedSpacing;

int defaultX = seletedX + selectedBitmapRadius - defaultBitmapRadius;

int defaultY = seletedY + selectedBitmapRadius - defaultBitmapRadius;

for (int i = 0; i < len; i++) {

if (i == 3 || i == 6) {

seletedX = seletedSpacing;

seletedY += selectedBitmapDiameter + seletedSpacing;

defaultX = seletedX + selectedBitmapRadius

  • defaultBitmapRadius;

defaultY += selectedBitmapDiameter + seletedSpacing;

}

points[i] = new PointInfo(i, defaultX, defaultY, seletedX, seletedY);

seletedX += selectedBitmapDiameter + seletedSpacing;

defaultX += selectedBitmapDiameter + seletedSpacing;

}

}

private void initPaint() {

initLinePaint(linePaint);

initTextPaint(textPaint);

initWhiteLinePaint(whiteLinePaint);

}

private void initTextPaint(Paint paint) {

textPaint.setTextSize(30);

textPaint.setAntiAlias(true);

textPaint.setTypeface(Typeface.MONOSPACE);

}

private void initLinePaint(Paint paint) {

// paint.setColor(Color.GRAY);

paint.setColor(Color.parseColor(“#1E90FF”));

// paint.setStyle(Style.STROKE);

paint.setStyle(Style.FILL);

paint.setStrokeWidth(10);

paint.setAntiAlias(true);

paint.setStrokeCap(Cap.ROUND);

}

private void initWhiteLinePaint(Paint paint) {

// paint.setColor(Color.WHITE);

paint.setColor(Color.parseColor(“#1E90FF”));

paint.setStrokeWidth(8);

paint.setAntiAlias(true);

paint.setStrokeCap(Cap.ROUND);

}

private void drawNinePoint(Canvas canvas) {

if (startPoint != null) {

drawEachLine(canvas, startPoint);

}

for (PointInfo pointInfo : points) {

if (pointInfo != null) {

if (pointInfo.isSelected()) {

canvas.drawBitmap(selectedBitmap, pointInfo.getSeletedX(),

pointInfo.getSeletedY(), null);

} else { // zj add else case

canvas.drawBitmap(defaultBitmap, pointInfo.getDefaultX(),

pointInfo.getDefaultY(), null);

}

}

}

}

/**

  • @param canvas

  • @param point

*/

private void drawEachLine(Canvas canvas, PointInfo point) {

if (point.hasNextId()) {

int n = point.getNextId();

drawLine(canvas, point.getCenterX(), point.getCenterY(),

points[n].getCenterX(), points[n].getCenterY());

drawEachLine(canvas, points[n]);

}

}

/**

  • @param canvas

  • @param startX

  • @param startY

  • @param stopX

  • @param stopY

*/

private void drawLine(Canvas canvas, float startX, float startY,

float stopX, float stopY) {

canvas.drawLine(startX, startY, stopX, stopY, linePaint);

canvas.drawLine(startX, startY, stopX, stopY, whiteLinePaint);

}

private class PointInfo {

private int id;

private int nextId;

private boolean selected;

private int defaultX;

private int defaultY;

private int seletedX;

private int seletedY;

public PointInfo(int id, int defaultX, int defaultY, int seletedX,

int seletedY) {

this.id = id;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BATJ 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。

节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

一键领取:【Android超硬核面试资料】

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?

1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析

achLine(canvas, startPoint);

}

for (PointInfo pointInfo : points) {

if (pointInfo != null) {

if (pointInfo.isSelected()) {

canvas.drawBitmap(selectedBitmap, pointInfo.getSeletedX(),

pointInfo.getSeletedY(), null);

} else { // zj add else case

canvas.drawBitmap(defaultBitmap, pointInfo.getDefaultX(),

pointInfo.getDefaultY(), null);

}

}

}

}

/**

  • @param canvas

  • @param point

*/

private void drawEachLine(Canvas canvas, PointInfo point) {

if (point.hasNextId()) {

int n = point.getNextId();

drawLine(canvas, point.getCenterX(), point.getCenterY(),

points[n].getCenterX(), points[n].getCenterY());

drawEachLine(canvas, points[n]);

}

}

/**

  • @param canvas

  • @param startX

  • @param startY

  • @param stopX

  • @param stopY

*/

private void drawLine(Canvas canvas, float startX, float startY,

float stopX, float stopY) {

canvas.drawLine(startX, startY, stopX, stopY, linePaint);

canvas.drawLine(startX, startY, stopX, stopY, whiteLinePaint);

}

private class PointInfo {

private int id;

private int nextId;

private boolean selected;

private int defaultX;

private int defaultY;

private int seletedX;

private int seletedY;

public PointInfo(int id, int defaultX, int defaultY, int seletedX,

int seletedY) {

this.id = id;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-CwXSF6RX-1710503568805)]
[外链图片转存中…(img-C0QyXDry-1710503568806)]
[外链图片转存中…(img-9oWLCKN7-1710503568806)]
[外链图片转存中…(img-BsU10nky-1710503568807)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-F380C3oq-1710503568807)]

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BATJ 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。

节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

一键领取:【Android超硬核面试资料】

《960全网最全Android开发笔记》

[外链图片转存中…(img-58NY0j2S-1710503568807)]

《379页Android开发面试宝典》

历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?

1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

[外链图片转存中…(img-JVp0pkYZ-1710503568808)]

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

[外链图片转存中…(img-c5j3fLon-1710503568808)]

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析

[外链图片转存中…(img-IelyPW7J-1710503568808)]

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图,大家可以点击这里自行获取。

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值