Android 发送给我日志的问题

Android 发送给我日志的问题,android,Android,我曾尝试在我的应用程序中实现“向我发送日志”功能,但我无法正确执行。谁能帮我一下吗?在logcat中,它显示错误: 03-29 21:23:37.636: ERROR/AndroidRuntime(820): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception 03-29 21:23:37.726: ERROR/AndroidRuntime(820): java.lang.RuntimeException

我曾尝试在我的应用程序中实现“向我发送日志”功能,但我无法正确执行。谁能帮我一下吗?在logcat中,它显示错误:

03-29 21:23:37.636: ERROR/AndroidRuntime(820): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception 03-29 21:23:37.726: ERROR/AndroidRuntime(820): java.lang.RuntimeException: An error occured while executing doInBackground() 03-29 21:23:37.726: ERROR/AndroidRuntime(820): at android.os.AsyncTask$3.done(AsyncTask.java:200) 03-29 21:23:37.726: ERROR/AndroidRuntime(820): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234) 03-29 21:23:37.726: ERROR/AndroidRuntime(820): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258) 03-29 21:23:37.726: ERROR/AndroidRuntime(820): at java.util.concurrent.FutureTask.run(FutureTask.java:122) 03-29 21:23:37.726: ERROR/AndroidRuntime(820): at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648) 03-29 21:23:37.726: ERROR/AndroidRuntime(820): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673) 03-29 21:23:37.726: ERROR/AndroidRuntime(820): at java.lang.Thread.run(Thread.java:1058) 03-29 21:23:37.726: ERROR/AndroidRuntime(820): Caused by: java.lang.NullPointerException 03-29 21:23:37.726: ERROR/AndroidRuntime(820): at resonet.android.androidgallery.helloAndroid$CheckForceCloseTask.doInBackground(helloAndroid.java:1565) 03-29 21:23:37.726: ERROR/AndroidRuntime(820): at resonet.android.androidgallery.helloAndroid$CheckForceCloseTask.doInBackground(helloAndroid.java:1) 03-29 21:23:37.726: ERROR/AndroidRuntime(820): at android.os.AsyncTask$2.call(AsyncTask.java:185) 03-29 21:23:37.726: ERROR/AndroidRuntime(820): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256) 03-29 21:23:37.726: ERROR/AndroidRuntime(820): ... 4 more 03-29 21:23:37.636:错误/AndroidRuntime(820):未捕获处理程序:线程异步任务#1由于未捕获异常而退出 03-29 21:23:37.726:错误/AndroidRuntime(820):java.lang.RuntimeException:执行doInBackground()时出错 03-29 21:23:37.726:ERROR/AndroidRuntime(820):在android.os.AsyncTask$3.done(AsyncTask.java:200) 03-29 21:23:37.726:ERROR/AndroidRuntime(820):位于java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234) 03-29 21:23:37.726:ERROR/AndroidRuntime(820):位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258) 03-29 21:23:37.726:ERROR/AndroidRuntime(820):在java.util.concurrent.FutureTask.run(FutureTask.java:122) 03-29 21:23:37.726:ERROR/AndroidRuntime(820):位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648) 03-29 21:23:37.726:ERROR/AndroidRuntime(820):位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673) 03-29 21:23:37.726:ERROR/AndroidRuntime(820):在java.lang.Thread.run(Thread.java:1058)处 03-29 21:23:37.726:错误/AndroidRuntime(820):由以下原因引起:java.lang.NullPointerException 03-29 21:23:37.726:ERROR/AndroidRuntime(820):位于resonet.android.androidgallery.helloAndroid$CheckForceCloseTask.doInBackground(helloAndroid.java:1565) 03-29 21:23:37.726:ERROR/AndroidRuntime(820):位于resonet.android.androidgallery.helloAndroid$CheckForceCloseTask.doInBackground(helloAndroid.java:1) 03-29 21:23:37.726:ERROR/AndroidRuntime(820):在android.os.AsyncTask$2.call(AsyncTask.java:185) 03-29 21:23:37.726:ERROR/AndroidRuntime(820):位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256) 03-29 21:23:37.726:错误/AndroidRuntime(820):。。。4更多 这是我的密码:

public class helloAndroid extends Activity implements OnClickListener {

public static final int DIALOG_SEND_LOG = 345350;
protected static final int DIALOG_PROGRESS_COLLECTING_LOG = 3255;
protected static final int DIALOG_FAILED_TO_COLLECT_LOGS = 3535122;


private static final int DIALOG_REPORT_FORCE_CLOSE = 3535788;

 private LogCollector mLogCollector;

public void onCreate(Bundle savedInstanceState) {


requestWindowFeature(Window.FEATURE_NO_TITLE);

  Bundle b = this.getIntent().getExtras();
  s = b.getString("specialValue").trim();
  String xmlURL = "";

  CheckForceCloseTask task = new CheckForceCloseTask();
     task.execute();
    }
    private void throwException() {
  throw new NullPointerException();
 }

 @Override
 protected Dialog onCreateDialog(int id) {
  Dialog dialog = null;
  switch (id) {
  case DIALOG_SEND_LOG:
  case DIALOG_REPORT_FORCE_CLOSE:
   Builder builder = new AlertDialog.Builder(this);
   String message;
   if (id==DIALOG_SEND_LOG)
    message = "Do you want to send me your logs?";
   else 
    message = "It appears this app has been force-closed, do you want to report it to me?";
   builder.setTitle("Warning")
   .setIcon(android.R.drawable.ic_dialog_alert)
   .setMessage(message)
   .setPositiveButton("Yes", this)
   .setNegativeButton("No", this);
   dialog = builder.create();
   break;
  case DIALOG_PROGRESS_COLLECTING_LOG:
   ProgressDialog pd = new ProgressDialog(this);
   pd.setTitle("Progress");
   pd.setMessage("Collecting logs...");
   pd.setIndeterminate(true);
   dialog = pd;   
   break;
  case DIALOG_FAILED_TO_COLLECT_LOGS:
   builder = new AlertDialog.Builder(this);
   builder.setTitle("Error")
   .setMessage("Failed to collect logs.")
   .setNegativeButton("OK", null);
   dialog = builder.create();
  }
  return dialog;
 }

 class CheckForceCloseTask extends AsyncTask<Void, Void, Boolean> {
  @Override
  protected Boolean doInBackground(Void... params) {
   return mLogCollector.hasForceCloseHappened();
  }

  @Override
  protected void onPostExecute(Boolean result) {
   if (result) {
    showDialog(DIALOG_REPORT_FORCE_CLOSE);
   } else
    Toast.makeText(getApplicationContext(), "No force close detected.", Toast.LENGTH_LONG).show();
  }
 }

 public void onClick(DialogInterface dialog, int which) {
  switch (which) {
  case DialogInterface.BUTTON_POSITIVE:
   new AsyncTask<Void, Void, Boolean>() {
    @Override
    protected Boolean doInBackground(Void... params) {
     return mLogCollector.collect();
    }
    @Override
    protected void onPreExecute() {
     showDialog(DIALOG_PROGRESS_COLLECTING_LOG);
    }
    @Override
    protected void onPostExecute(Boolean result) {
     dismissDialog(DIALOG_PROGRESS_COLLECTING_LOG);
     if (result)
      mLogCollector.sendLog("lintonye@gmail.com", "Error Log", "Preface\nPreface line 2");
     else
      showDialog(DIALOG_FAILED_TO_COLLECT_LOGS);
    }

   }.execute();
  }
  dialog.dismiss();
 }
}
公共类helloAndroid扩展活动实现OnClickListener{
公共静态最终整型对话框发送日志=345350;
受保护的静态最终整数对话框\进度\收集\日志=3255;
受保护的静态最终整数对话框\u未能\u收集\u日志=3535122;
私有静态最终整型对话框报告强制关闭=3535788;
私有日志收集器mLogCollector;
创建时的公共void(Bundle savedInstanceState){
requestWindowFeature(窗口。功能\u无\u标题);
Bundle b=this.getIntent().getExtras();
s=b.getString(“specialValue”).trim();
字符串xmlURL=“”;
CheckForceCloseTask任务=新建CheckForceCloseTask();
task.execute();
}
私有void throwException(){
抛出新的NullPointerException();
}
@凌驾
受保护的对话框onCreateDialog(int id){
Dialog=null;
开关(id){
案例对话框\u发送\u日志:
案例对话框\报告\强制\关闭:
Builder Builder=新建AlertDialog.Builder(此);
字符串消息;
if(id==对话框\u发送\u日志)
message=“是否要将您的日志发送给我?”;
其他的
message=“此应用程序似乎已被强制关闭,是否向我报告?”;
builder.setTitle(“警告”)
.setIcon(android.R.drawable.ic_对话框_警报)
.setMessage(消息)
.setPositiveButton(“是”,此选项)
.setNegativeButton(“否”,此选项);
dialog=builder.create();
打破
案例对话框\u进度\u收集\u日志:
ProgressDialog pd=新的ProgressDialog(本);
pd.设定标题(“进度”);
pd.setMessage(“收集日志…”);
pd.SetUndeterminate(真);
dialog=pd;
打破
案例对话框\u未能收集\u日志:
builder=新建AlertDialog.builder(此);
builder.setTitle(“错误”)
.setMessage(“收集日志失败”)
.setNegativeButton(“确定”,空);
dialog=builder.create();
}
返回对话框;
}
类CheckForceCloseTask扩展了AsyncTask{
@凌驾
受保护的布尔doInBackground(Void…params){
返回mLogCollector.hasforceCloseOccessed();
}
@凌驾
受保护的void onPostExecute(布尔结果){
如果(结果){
showDialog(对话框报告强制关闭);
}否则
Toast.makeText(getApplicationContext(),“未检测到强制关闭”,Toast.LENGTH_LONG.show();
}
}
public void onClick(DialogInterface dialog,int which){
开关(哪个){
case DialogInterface.BUTTON_阳性:
新建异步任务(){
@凌驾
受保护的布尔doInBackground(Void…params){
返回mLogCollector.collect();
}
@凌驾
受保护的void onPreExecute(){
showDialog(对话框\进度\收集\日志);
}
@凌驾
受保护的void onPostExecute(布尔结果){
dismissDialog(对话框\进度\收集\日志);
如果(结果)
mLogCollector.sendLog(“lintonye@gmail.com“,”错误日志“,”前言\n引用第2行“;
其他的
showDialog(DIALOG\u收集日志失败);
}
}.execute();
}
dialog.dismise();
}
}

问题在于
mLogCollector
从未初始化,因此它始终为空。这将在
doInBackground
中为您提供一个
NullPointerException

您可以在stacktrace中看到:

Caused by: java.lang.NullPointerException
  at resonet.android.androidgallery.helloAndroid$CheckForceCloseTask.doInBackground(helloAndroid.java:1565)
如果您阅读了文档的“用法”部分,其中以粗体大写字母表示的第一件事是:

实例化LogCollector

LogCollector collector = new LogCollector(context);

您需要这样做。

只是想指出LogCollector库在Droid X 2.3.X上不起作用。

谢谢Mark。我不知道。在我添加mLogCollector=newlogcollector(this)之后;这条线就行了。但是,当我单击报告force close时,它会显示一条消息,表示不支持的操作-该操作当前不受支持。我在代码中遗漏了什么,以便能够将日志发送到我的电子邮件?