при запуске приложения получаю ошибку:
02-08 19:47:41.997 6071 6071 D WakeMainActivity: [onCreate] begin
02-08 19:47:42.016 6071 6071 D WakeMainActivity: keyCode:0
02-08 19:47:42.016 6071 6071 D WakeGestureUtil: [isAppPresence] begin
02-08 19:47:42.017 6071 6071 D WakeSqliteManager: [SqliteManager]
02-08 19:47:42.017 6071 6071 D WakeSqliteManager: [queryAll]
02-08 19:47:42.018 6071 6071 D AndroidRuntime: Shutting down VM
02-08 19:47:42.020 6071 6071 E AndroidRuntime: FATAL EXCEPTION: main
02-08 19:47:42.020 6071 6071 E AndroidRuntime: Process: com.wheatek.wakegesture, PID: 6071
02-08 19:47:42.020 6071 6071 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.wheatek.wakegesture/com.wheatek.wakegesture.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2684)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2751)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at android.app.ActivityThread.-wrap12(ActivityThread.java)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1496)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at android.os.Looper.loop(Looper.java:154)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6186)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at com.wheatek.wakegesture.sqlite.SqliteManager.queryAll(SqliteManager.java:67)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at com.wheatek.wakegesture.sqlite.SqliteManager.<init>(SqliteManager.java:21)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at com.wheatek.wakegesture.util.GestureUtil.isAppPresence(GestureUtil.java:200)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at com.wheatek.wakegesture.MainActivity.onCreate(MainActivity.java:24)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:6684)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2637)
02-08 19:47:42.020 6071 6071 E AndroidRuntime: ... 9 more
02-08 19:47:42.023 831 2882 W ActivityManager: Force finishing activity com.wheatek.wakegesture/.MainActivity
02-08 19:47:42.029 831 2882 W ActivityManager: Force finishing activity com.android.settings/.Settings$GestureSettingsActivity
выясил, что причиной является вот этот повторяющийся код
SQLiteDatabase db = this.gestureSqliteOpenHelper.getWritableDatabase();
в этом коде
package com.wheatek.wakegesture.sqlite;
import android.content.Context;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.text.TextUtils;
import android.util.Log;
import com.wheatek.wakegesture.R;
import com.wheatek.wakegesture.bean.KeyGestureFunction;
import com.wheatek.wakegesture.util.GestureUtil;
import java.util.ArrayList;
public class SqliteManager {
private GestureSqliteOpenHelper gestureSqliteOpenHelper = new GestureSqliteOpenHelper(this.mContext);
private Context mContext;
public SqliteManager(Context context) {
Log.d("WakeSqliteManager", "[SqliteManager]");
this.mContext = context;
if (queryAll() == null || queryAll().size() == 0) {
initAllKey();
}
}
public void addKEY(int key, String key_description, int type, String package_name, String apps_activity, String apps_name) {
Log.d("WakeSqliteManager", "[addKEY] key_description:" + key_description);
SQLiteDatabase db = this.gestureSqliteOpenHelper.getWritableDatabase();
db.execSQL("insert into gestureSettings(key,key_description,action_type,package_name,apps_activity,apps_name) values(?,?,?,?,?,?)", new Object[]{Integer.valueOf(key), key_description, Integer.valueOf(type), package_name, apps_activity, apps_name});
db.close();
Log.d("WakeSqliteManager", "[SqliteManager] end");
}
public String[] queryKey(int key) {
Log.d("WakeSqliteManager", "[queryKey] key:" + key);
String[] str_key = null;
SQLiteDatabase db = this.gestureSqliteOpenHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select * from gestureSettings where key=?", new String[]{key + ""});
if (cursor != null) {
if (cursor.moveToFirst()) {
str_key = new String[]{cursor.getInt(cursor.getColumnIndex("action_type")) + "", cursor.getString(cursor.getColumnIndex("package_name")), cursor.getString(cursor.getColumnIndex("apps_activity"))};
}
cursor.close();
db.close();
return str_key;
}
cursor.close();
db.close();
return null;
}
public void updateKey(int key, int type, String package_name, String apps_activity, String apps_name) {
Log.d("WakeSqliteManager", "[updateKey] apps_name:" + apps_name);
SQLiteDatabase db = this.gestureSqliteOpenHelper.getWritableDatabase();
db.execSQL("update gestureSettings set action_type=?, package_name=?,apps_activity=?,apps_name=? where key=?", new Object[]{Integer.valueOf(type), package_name, apps_activity, apps_name, Integer.valueOf(key)});
if (TextUtils.isEmpty(package_name)) {
GestureUtil.setSwitchStatus(this.mContext, key, false);
} else {
GestureUtil.setSwitchStatus(this.mContext, key, true);
}
db.close();
Log.d("WakeSqliteManager", "[updateKey] end");
}
public ArrayList<KeyGestureFunction> queryAll() {
Log.d("WakeSqliteManager", "[queryAll]");
SQLiteDatabase db = this.gestureSqliteOpenHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select * from gestureSettings ", new String[0]);
ArrayList<KeyGestureFunction> keyGestureFunctions = new ArrayList();
if (cursor != null) {
while (cursor.moveToNext()) {
keyGestureFunctions.add(new KeyGestureFunction(cursor.getInt(cursor.getColumnIndex("key")), cursor.getString(cursor.getColumnIndex("key_description")), cursor.getInt(cursor.getColumnIndex("action_type")), cursor.getString(cursor.getColumnIndex("package_name")), cursor.getString(cursor.getColumnIndex("apps_activity")), cursor.getString(cursor.getColumnIndex("apps_name"))));
}
cursor.close();
db.close();
return keyGestureFunctions;
}
cursor.close();
db.close();
return null;
}
public void initAllKey() {
Log.d("WakeSqliteManager", "[initAllKey] begin");
Resources resources = this.mContext.getResources();
boolean is_default_application = resources.getBoolean(R.bool.is_configuration_default_application);
int[] default_gesture_switch = resources.getIntArray(R.array.default_gesture_switch);
int[] key_int = resources.getIntArray(R.array.default_gesture_key);
String[] default_Apps = resources.getStringArray(R.array.default_gesture_application);
String[] key_decription = resources.getStringArray(R.array.array_gesture_letter);
int i;
String[] temp_pack;
if (!is_default_application) {
for (i = 0; i < key_int.length; i++) {
addKEY(key_int[i], key_decription[i], -1, null, null, null);
GestureUtil.setSwitchStatus(this.mContext, key_int[i], false);
}
} else if (this.mContext.getResources().getBoolean(R.bool.is_function_gesture)) {
for (i = 0; i < 5; i++) {
GestureUtil.setSwitchStatus(this.mContext, i, default_gesture_switch[i] == 1);
}
for (i = 4; i < key_int.length; i++) {
temp_pack = default_Apps[i].split("_");
if (temp_pack.length == 3) {
addKEY(key_int[i], key_decription[i], 2, temp_pack[1], temp_pack[2], temp_pack[0]);
GestureUtil.setSwitchStatus(this.mContext, key_int[i], true);
}
}
} else {
GestureUtil.setSwitchStatus(this.mContext, 34, default_gesture_switch[0] == 1);
for (i = 0; i < key_int.length; i++) {
temp_pack = default_Apps[i].split("_");
if (temp_pack.length == 3) {
addKEY(key_int[i], key_decription[i], 2, temp_pack[1], temp_pack[2], temp_pack[0]);
GestureUtil.setSwitchStatus(this.mContext, key_int[i], true);
}
}
}
Log.d("WakeSqliteManager", "[initAllKey] end");
}
}
mContextопределяется после инициализации объекта где она используется. Естественно, вы всегда будете получать NPE, т.к. она имеетnullзначение. – Rootware Feb 10 '18 at 00:47