在尝试连接到 Web 服务(在线托管的 XML 文件)时,我遇到了通知显示为空值的问题。结果是 NullPointerException 我只需要一些帮助来查明问题的根源。我熟悉调试器以及如何记录和设置断点——我只需要一只手弄清楚我应该在哪里设置它们,而不是我已经拥有它们的地方(我仍然找不到问题的根源)。
附言
我已经包含了一些注释掉的代码(我很抱歉——我本可以把它拿出来缩短一点——但我想我可能会包括它,因为也许这就是问题所在)。
提前致谢!
日志猫:
08-16 10:21:19.531: I/System.out(1293): Sim State5
08-16 10:21:19.591: D/Network Availability(1293): CONNECTED
08-16 10:21:19.591: D/Network Availability(1293): NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true
08-16 10:21:19.751: I/Adreno200-EGLSUB(1293): <ConfigWindowMatch:2078>: Format RGBA_8888.
08-16 10:21:39.861: D/MDN(1293): 310410
08-16 10:21:39.861: D/mdn1(1293): 676
08-16 10:21:39.861: D/mdn2(1293): 251
08-16 10:21:39.861: D/ICCID(1293): 89014103234448884342
08-16 10:21:39.861: I/System.out(1293): ICCID%1234 = 1120
08-16 10:21:39.861: I/System.out(1293): ICCID/1234 = 72134605538451283
08-16 10:21:39.901: I/Adreno200-EGLSUB(1293): <ConfigWindowMatch:2078>: Format RGBA_8888.
08-16 10:21:45.201: V/In the parser(1293): now
08-16 10:21:45.221: V/value(1293): default,mms,supl
08-16 10:21:45.221: I/System.out(1293): size 1
08-16 10:21:45.231: I/System.out(1293): net10
08-16 10:21:45.231: I/System.out(1293): tfdata
08-16 10:21:45.371: I/Adreno200-EGLSUB(1293): <ConfigWindowMatch:2078>: Format RGBA_8888.
08-16 10:21:53.481: I/System.out(1293): count...1
08-16 10:21:53.481: I/System.out(1293): the values in notificationActivity :port=80 mmsproxy=mms3.tracfone.com numeric=310410 mcc=310 proxy=mms3.tracfone.com name=net10 mnc=410 apn=tfdata mmsc=http://mms-tf.net mmsport=80at is 0
08-16 10:21:53.481: W/NotificationActivity(1293): Extras null
08-16 10:21:54.231: D/FIELD(1293): Name
08-16 10:21:54.231: W/dalvikvm(1293): threadid=1: thread exiting with uncaught exception (group=0x40ab31f8)
08-16 10:21:54.231: E/AndroidRuntime(1293): FATAL EXCEPTION: main
08-16 10:21:54.231: E/AndroidRuntime(1293): java.lang.NullPointerException
08-16 10:21:54.231: E/AndroidRuntime(1293): at com.project.new.datasettings.ConfigFinalActivity.showNotification(ConfigFinalActivity.java:431)
08-16 10:21:54.231: E/AndroidRuntime(1293): at com.project.new.datasettings.ConfigFinalActivity.onClick(ConfigFinalActivity.java:208)
08-16 10:21:54.231: E/AndroidRuntime(1293): at android.view.View.performClick(View.java:3511)
08-16 10:21:54.231: E/AndroidRuntime(1293): at android.view.View$PerformClick.run(View.java:14111)
08-16 10:21:54.231: E/AndroidRuntime(1293): at android.os.Handler.handleCallback(Handler.java:605)
08-16 10:21:54.231: E/AndroidRuntime(1293): at android.os.Handler.dispatchMessage(Handler.java:92)
08-16 10:21:54.231: E/AndroidRuntime(1293): at android.os.Looper.loop(Looper.java:137)
08-16 10:21:54.231: E/AndroidRuntime(1293): at android.app.ActivityThread.main(ActivityThread.java:4429)
08-16 10:21:54.231: E/AndroidRuntime(1293): at java.lang.reflect.Method.invokeNative(Native Method)
08-16 10:21:54.231: E/AndroidRuntime(1293): at java.lang.reflect.Method.invoke(Method.java:511)
08-16 10:21:54.231: E/AndroidRuntime(1293): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
08-16 10:21:54.231: E/AndroidRuntime(1293): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
08-16 10:21:54.231: E/AndroidRuntime(1293): at dalvik.system.NativeStart.main(Native Method)
Nullpointer 出现在以下行:
String value = Values.get("name").toString();
资源:
public class ConfigFinalActivity extends Activity implements OnClickListener {
private static final String TAG = "ConfigActivity";
TelephonyManager tm;
AlertDialog mErrorAlert = null;
private Notification mNotification = null;
private Button mXButton = null;
private Button mAssistUpdateButton = null;
private Button mAssistInstrButton = null;
private Button mReadAgainButton = null;
private int mInstructionNumber = 0;
public static ArrayList<String> NameArr = new ArrayList<String>();
public static ArrayList<String> ValueArr = new ArrayList<String>();
public static ArrayList<String> nameArr = new ArrayList<String>();
public static ArrayList<String> ApnArr = new ArrayList<String>();
public static ArrayList<String> mmscArr = new ArrayList<String>();
public static ArrayList<String> mmsportArr = new ArrayList<String>();
public static ArrayList<String> mmsproxyArr = new ArrayList<String>();
public static ArrayList<String> portArr = new ArrayList<String>();
public static ArrayList<String> proxyArr = new ArrayList<String>();
public static int count;
public static int TotalSteps = 8;
int i, g = 0, result = 0;
String Result = "";
public static ContentValues Values = new ContentValues();
XmlParserHandlerFinal handler;
public static final Uri APN_TABLE_URI = Uri
.parse("content://telephony/carriers");
public static String Base_URL = "https://www.mysettings.com/";
public static InputStream stream = null;
UpdateActivity update;
public static String status;
/** Called when the activity is first created. */
@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int version = android.os.Build.VERSION.SDK_INT;
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
update = new UpdateActivity();
nameArr = update.getnameArr();
ApnArr = update.getApnArr();
mmscArr = update.getMMSCArr();
mmsproxyArr = update.getMmscProxyArr();
mmsportArr = update.getMmsPortArr();
proxyArr = update.getMmscProxyArr();
portArr = update.getMmsPortArr();
count = update.getCount();
if (ApnArr.isEmpty() || mmscArr.isEmpty() || mmsportArr.isEmpty()
|| mmsproxyArr.isEmpty() || proxyArr.isEmpty()
|| portArr.isEmpty()) {
tryagain();
} else if (version < VERSION_CODES.ICE_CREAM_SANDWICH) {
// Update APN table
try {
result = updateTable();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}// Settings updated with this atomic call
catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (result != -1) {
status = "success";
} else {
status = "failure";
}
if (status.equals("success")) {
completeUpdate();
} else if (status.equals("failure")) {
tryagain();
// showAlert(getString(R.string.unchanged_net10_dialog));
}
} else {// ICS and later versions
// Reduce number of steps to 6
TotalSteps = 6;
setContentView(R.layout.assist_update);
// String assistUpdate = getString(R.string.instructions_1);
// CharSequence styledText = Html.fromHtml(assistUpdate);
// TextView assistText = (TextView) findViewById(R.id.apn_app_text_cta2);
// assistText.setText(styledText);
mAssistUpdateButton = (Button) findViewById(R.id.assist_update_btn);
mAssistUpdateButton.setOnClickListener(this);
}
}
public void onClick(View v) {
switch(v.getId()) {
case R.id.assist_update_btn:
// Update button for ICS and up is selected
// Get the TextView in the Assist Update UI
TextView tv = (TextView) findViewById(R.id.apn_app_text_cta2);
String text = "";
CharSequence styledText = text;
switch (mInstructionNumber) {
case 0:
// Retrieve the instruction string resource corresponding the
// 2nd set of instructions
text = String.format(getString(R.string.apn_app_text_instr),
TotalSteps);
styledText = Html.fromHtml(text);
// Update the TextView with the correct set of instructions
tv.setText(styledText);
// Increment instruction number so the correct instructions
// string resource can be retrieve the next time the update
// button is pressed
mInstructionNumber++;
break;
case 1:
text = getString(R.string.apn_app_text_instr2);
styledText = Html.fromHtml(text);
tv.setText(styledText);
// Increment instruction number so the correct instructions
// string resource can be retrieve the next time the update
// button is pressed
mInstructionNumber++;
break;
case 2:
// Final set of instructions-Change to the corresponding layout
setContentView(R.layout.assist_instructions);
String assistUpdateInstr = String.format(
getString(R.string.apn_app_text_instr3), TotalSteps);
//styledText = Html.fromHtml(assistUpdateInstr);
TextView assistInstrText = (TextView) findViewById(R.id.updated_text);
//assistInstrText.setText(styledText);
mAssistInstrButton = (Button) findViewById(R.id.assist_instr_btn);
//mReadAgainButton = (Button) findViewById(R.id.read_again_btn);
mAssistInstrButton.setOnClickListener(this);
// mReadAgainButton.setOnClickListener(this);
// "LET'S DO THIS" Button in final instructions screen for ICS
// and
// up is selected
// Create ConfigActivity Intent
Intent i = new Intent(this,
NotificationActivityForMultiProf.class);
// Invoke ConfigActivity Intent to start the assisted update
startActivity(i);
// finish();
// startActivity(new Intent(Settings.ACTION_APN_SETTINGS));
}
} if (v == mAssistInstrButton) {
// mAssistUpdateButton = (Button)
// findViewById(R.id.assist_update_btn);
// mAssistUpdateButton.setOnClickListener(this);
startActivity(new Intent(Settings.ACTION_APN_SETTINGS));
try {
showNotification();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finish();// } else if (v == mReadAgainButton) {
// go back to set of instructions if read again is selected
// mInstructionNumber = 2;
// setContentView(R.layout.screen5);
//// String one_text = String
//// .format(getString(R.string.one), TotalSteps);
//// CharSequence styledText_one = Html.fromHtml(one_text);
// TextView one = (TextView) findViewById(R.id.text_one);
// one.setTextSize(18);
// one.setText(styledText_one);
// String two_text = String
// .format(getString(R.string.two), TotalSteps);
// CharSequence styledText_two = Html.fromHtml(two_text);
// TextView two = (TextView) findViewById(R.id.text_two);
// two.setTextSize(18);
// two.setText(styledText_two);
// String three_text = String.format(getString(R.string.three),
// TotalSteps);
// CharSequence styledText_three = Html.fromHtml(three_text);
// TextView three = (TextView) findViewById(R.id.text_three);
// three.setTextSize(18);
// three.setText(styledText_three);
// mAssistUpdateButton = (Button) findViewById(R.id.assist_instr_btn);
// mAssistUpdateButton.setOnClickListener(this);
}
}
/*
* Insert a new APN entry into the system APN table Require an apn name, and
* the apn address. More can be added. Return an id (_id) that is
* automatically generated for the new apn entry.
*/
public int InsertAPN() throws SecurityException {
int id = -1;
for (i = 0; i < count; i++) {
ContentValues values2 = new ContentValues();
// values2 = values1;
values2 = getValues();
ContentResolver resolver = getContentResolver();
Cursor c = null;
try {
Uri newRow = resolver.insert(APN_TABLE_URI, values2);
// System.out.println("values in insertAPN" + values1);
if (newRow != null) {
c = resolver.query(newRow, null, null, null, null);
Log.d(TAG, "Newly added APN:");
// TF Settings have been inserted
// Obtain the apn id
int idindex = c.getColumnIndex("_id");
c.moveToFirst();
id = c.getShort(idindex);
Log.d(TAG, "New ID: " + id
+ ": Inserting new APN succeeded!");
}
} catch (SQLException e) {
Log.d(TAG, e.getMessage());
}
if (c != null)
c.close();
}
return id;
}
public ContentValues getValues() {
ContentValues values = new ContentValues();
Log.d("name", (nameArr.get(i)));
Log.d("apn", (ApnArr.get(i)));
Log.d("mmsc", (mmscArr.get(i)));
Log.d("mmsproxy", (mmsproxyArr.get(i)));
Log.d("mmsport", (mmsportArr.get(i)));
Log.d("proxy", (proxyArr.get(i)));
Log.d("port", (portArr.get(i)));
Log.d("mcc", (getString(R.string.mcc)));
values.put("name", nameArr.get(i));
values.put("apn", ApnArr.get(i));
values.put("mmsc", mmscArr.get(i));
values.put("mmsproxy", mmsproxyArr.get(i));
values.put("mmsport", mmsportArr.get(i));
values.put("proxy", proxyArr.get(i));
values.put("port", portArr.get(i));
values.put("mcc", (getString(R.string.mcc)));
if ((tm.getSimOperator()).equals(getString(R.string.numeric_tmo))) {
values.put("numeric", getString(R.string.numeric_tmo));
values.put("mnc", (getString(R.string.mnc_tmo)));
} else if ((tm.getSimOperator())
.equals(getString(R.string.numeric_att))) {
values.put("numeric", getString(R.string.numeric_att));
values.put("mnc", (getString(R.string.mnc_att)));
}
return values;
}
/*
* Delete APN data where the indicated field has the values Entire table is
* deleted if both field and value are null
*/
private void DeleteAPNs(String field, String[] values)
throws SecurityException {
int c = 0;
c = getContentResolver().delete(APN_TABLE_URI, null, null);
if (c != 0) {
String s = "APNs Deleted:\n";
Log.d(TAG, s);
}
}
/*
* Return all column names stored in the string array
*/
private String getAllColumnNames(String[] columnNames) {
String s = "Column Names:\n";
for (String t : columnNames) {
s += t + ":\t";
}
return s + "\n";
}
/*
* Copy all data associated with the 1st record Cursor c. Return a
* ContentValues that contains all record data.
*/
private ContentValues copyRecordFields(Cursor c) {
if (c == null)
return null;
int row_cnt = c.getCount();
Log.d(TAG, "Total # of records: " + row_cnt);
ContentValues values = new ContentValues();//
if (c.moveToFirst()) {
String[] columnNames = c.getColumnNames();
Log.d(TAG, getAllColumnNames(columnNames));
String row = "";
for (String columnIndex : columnNames) {
int i = c.getColumnIndex(columnIndex);
row += c.getString(i) + ":\t";
// if (i>0)//Avoid copying the id field
// id to be auto-generated upon record insertion
values.put(columnIndex, c.getString(i));
}
row += "\n";
Log.d(TAG, row);
Log.d(TAG, "End Of Records");
}
return values;
}
// showAlert displays the text contained in message as an alert
public void showAlert(String message) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(message).setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
ConfigFinalActivity.this.finish();
}
});
mErrorAlert = builder.create();
mErrorAlert.show();
}
// showErrorAlert displays an alert with layout and a title
private void showErrorAlert(int layoutRes, String title) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// Get the layout inflater
LayoutInflater inflater = ConfigFinalActivity.this.getLayoutInflater();
// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
builder.setTitle(title)
.setView(inflater.inflate(layoutRes, null))
.setPositiveButton(getString(R.string.assisted_button),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
startActivity(new Intent(
Settings.ACTION_APN_SETTINGS));
try {
showNotification();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
mErrorAlert = builder.create();
mErrorAlert.show();
}
// showNotification starts the process of sending notifications to the bar
// to assist the user in updating the data settings on ICS and later
// versions of Android
@SuppressWarnings("deprecation")
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
void showNotification() throws SAXException, ParserConfigurationException {
String field = getString(R.string.config_name_label);
Log.d("FIELD", field);
String value = Values.get("name").toString();
Log.d("VALUES", value);
int mId = 1;
String title = "1 of " + TotalSteps + " (Update " + field + ":)";
Notification.Builder mBuilder = new Notification.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle(title).setContentText(value);
Intent resultIntent = new Intent(this, NotificationActivityForMultiProf.class);
resultIntent.putExtra(field, value);
PendingIntent resultPendingIntent = PendingIntent.getActivity(
getApplicationContext(), 0, resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// mId allows you to update the notification later on.
mNotification = mBuilder.getNotification();
mNotification.flags |= Notification.FLAG_AUTO_CANCEL;
mNotificationManager.notify(mId, mNotification);
finish();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
if (mNotification != null) {
outState.putString("NOTIFICATIONB", mNotification.toString());
}
}
@Override
protected void onRestart() {
super.onRestart();
if (mErrorAlert != null)
mErrorAlert.dismiss();
}
private int updateTable() throws IOException, SAXException,
ParserConfigurationException {
int insertResult = -1;
// returned value if table is not properly updated
try {
ContentValues values = new ContentValues();
// Query the carrier table for the current data settings
Cursor c = getContentResolver().query(APN_TABLE_URI, null,
"current=?", new String[] { "1" }, null);
values = copyRecordFields(c);
// Copy the NET10 settings into values
// Replace T-Mo/ATT Data settings if there is no SIM or
// NET10/T-Mo/ATT SIM is
// present
if (tm.getSimState() == TelephonyManager.SIM_STATE_ABSENT
|| (tm.getSimOperator())
.equals(getString(R.string.numeric_tmo))) {
// delete all APNs before adding new APNs
DeleteAPNs("numeric=?",
new String[] { getString(R.string.numeric_tmo) });
// Insert NET10 Data Settings into Carrier table
insertResult = InsertAPN();
} else if (tm.getSimState() == TelephonyManager.SIM_STATE_ABSENT
|| (tm.getSimOperator())
.equals(getString(R.string.numeric_att))) {
// Delete all APNs before adding new APNs
DeleteAPNs("numeric=?",
new String[] { getString(R.string.numeric_att) });
// Insert NET10 Data Settings into Carrier table
insertResult = InsertAPN();
// } else
// non NET10/ non T-Mo SIM/non ATT SIM
// showAlert(getString(R.string.insert_net10_dialog));
} } catch (SecurityException e) {
// showErrorAlert(R.layout.assisted_settings,
// getString(R.string.assited_title));
Log.d(TAG, e.getMessage());
}
return insertResult;
}
private void completeUpdate() {
// Displaying final layout after pre-ICS automatic settings update
setContentView(R.layout.completion);
// TextView mCompleted = (TextView) findViewById(R.id.done_text1);
// String mDoneText = String.format(getString(R.string.done_text1));
// CharSequence styledText = Html.fromHtml(mDoneText);
// mCompleted.setText(styledText);
mAssistUpdateButton = (Button) findViewById(R.id.assist_update_btn);
mAssistUpdateButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
public void tryagain() {
// Displaying final layout after failure of pre-ICS automatic settings
// update
//setContentView(R.layout.tryagain);
String tryAgainText = "";
CharSequence styledTryAgainText;
//
// tryAgainText = String.format(getString(R.string.tryagain_text1),
// TotalSteps);
// styledTryAgainText = Html.fromHtml(tryAgainText);
// TextView tryAgain1 = (TextView) findViewById(R.id.tryagain_text1);
// tryAgain1.setText(styledTryAgainText);
//
// tryAgainText = String.format(getString(R.string.tryagain_text2),
// TotalSteps);
// styledTryAgainText = Html.fromHtml(tryAgainText);
// TextView tryAgain2 = (TextView) findViewById(R.id.tryagain_text2);
// tryAgain2.setText(styledTryAgainText);
//
// tryAgainText = String.format(getString(R.string.tryagain_text3),
// TotalSteps);
// styledTryAgainText = Html.fromHtml(tryAgainText);
// TextView tryAgain3 = (TextView) findViewById(R.id.tryagain_text3);
// tryAgain3.setText(styledTryAgainText);
}
// This function return a cursor to the table holding the
// the APN configurations (Carrier table)
public Cursor getConfigTableCursor() {
return getContentResolver()
.query(APN_TABLE_URI, null, null, null, null);
}
public ArrayList<String> getnameArr() {
return nameArr;
}
public ArrayList<String> getApnArr() {
return ApnArr;
}
public ArrayList<String> getMMSCArr() {
return mmscArr;
}
public ArrayList<String> getMmscProxyArr() {
return mmsproxyArr;
}
public ArrayList<String> getMmsPortArr() {
return mmsportArr;
}
public int getCount() {
return count;
}
public ArrayList<String> getProxyArr() {
return proxyArr;
}
public ArrayList<String> getPortArr() {
return portArr;
}
}