相关疑难解决方法(0)

需要处理未捕获的异常并发送日志文件

更新:请参阅下面的"已接受"解决方案

当我的应用创建未处理的异常,而不是简单地终止时,我想首先让用户有机会发送日志文件.我意识到在获得随机异常后做更多的工作是有风险的,但是,嘿,最糟糕的是应用程序完成崩溃并且日志文件没有被发送.结果比我想象的更棘手:)

什么有效:(1)捕获未捕获的异常,(2)提取日志信息并写入文件.

什么不起作用:(3)开始发送电子邮件的活动.最终,我还有另一项活动要求用户的许可.如果我让电子邮件活动正常工作,我不会对另一方感到麻烦.

问题的关键是我的Application类中捕获了未处理的异常.由于这不是一个Activity,因此如何使用Intent.ACTION_SEND启动活动并不明显.也就是说,通常在启动一个活动时,调用startActivity并使用onActivityResult恢复.Activity支持这些方法,但Application不支持.

有关如何做到这一点的任何建议?

以下是一些代码剪辑作为入门指南:

public class MyApplication extends Application
{
  defaultUncaughtHandler = Thread.getDefaultUncaughtExceptionHandler();
  public void onCreate ()
  {
    Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
    {
      @Override
      public void uncaughtException (Thread thread, Throwable e)
      {
        handleUncaughtException (thread, e);
      }
    });
  }

  private void handleUncaughtException (Thread thread, Throwable e)
  {
    String fullFileName = extractLogToFile(); // code not shown

    // The following shows what I'd like, though it won't work like this.
    Intent intent = new Intent (Intent.ACTION_SEND);
    intent.setType ("plain/text");
    intent.putExtra (Intent.EXTRA_EMAIL, new …
Run Code Online (Sandbox Code Playgroud)

android exception-handling logcat

107
推荐指数
4
解决办法
9万
查看次数

发布Android相机而不重启?

我正在尝试让相机在我的应用程序中运行,而我对整个camera.release()事情都有疑问; 我正在做非常复杂的事情并且没有明确的方式来简单地调用camera.release()所以我必须继续尝试新方法,但每次我弄错了我的应用程序崩溃(如预期的那样),让相机不被释放.因此,为了能够再次测试我的应用程序,我需要重新启动手机才能刷新相机.

有没有办法通过终端或DDMS释放相机,还是通过重新启动手机释放相机的唯一方法?它已经变得很老了,特别是当一个小错误导致浪费时间等待我的手机重新启动时.

谢谢!

camera android adb ddms android-camera

17
推荐指数
2
解决办法
1万
查看次数

全局未捕获的异常处理程序 - >电子邮件记录给我?

有没有办法在我自己的Android应用程序中捕获崩溃?像全局未捕获的异常处理程序?只是想知道我是否可以安装类似的东西,然后如果抛出未捕获的异常,我可以为用户弹出一个对话框,并询问他们是否要将异常转储邮寄给我.

谢谢

android

15
推荐指数
1
解决办法
7457
查看次数

如何防止Android应用程序因后台线程中的异常而崩溃?

这是一个普遍的问题,从具体情况中提出,但我想得到一般答案如何处理以下情况:

背景:

我有一个应用程序,它使用一些第三方库(广告网络提供商SDK - 特别是 - AdMobSDK,基于Google Play Services).该库的功能对于应用程序并不重要.该库创建一个或多个后台工作线程.有时(非常罕见的情况),其中一个后台线程中存在未处理的异常,从而导致应用程序崩溃.我想忽略由此库引起的所有异常,无论其原因如何:在最坏的情况下,应用程序用户将看不到广告 - 它比应用程序崩溃要好得多.

由于库本身创建了后台线程 - 我不能通过try/catch包装它们.

有没有办法捕获所有非处理后台(非主要)线程异常,只是为了在这种情况下杀死线程,并防止应用程序崩溃?

相关问题

我看到了很多的几个问题,但有些过于具体(而不是覆盖我的情况),其他参考状况的时候,开发者对线程创建一个控制,并能包住整个线程与try/catch语句.如果我仍然错过相关问题,涵盖此案例,我将非常感谢这个链接

java crash multithreading android exception

14
推荐指数
1
解决办法
1万
查看次数

在Android App中使用多个崩溃报告工具会产生什么影响

在我的应用程序中,我整合了Crashlytics,ACRA和Google Analytics来报告崩溃事件

- >一个人对其他人有任何副作用吗?

- >哪一个更好用.

- >崩溃报告工具如何工作,如果遇到崩溃,其他人将如何报告相同的崩溃?

android google-analytics crash-dumps acra crashlytics

6
推荐指数
1
解决办法
759
查看次数

Android全局错误处理和报告活动

我有没有办法注册一个全局错误处理程序,以防止应用程序崩溃?此处描述了崩溃报告:如何从Android应用程序获取崩溃数据?.我有一个想法是扩展这些解决方案以接受应用程序上下文,以便可以重定向到特定的报告活动?但是一旦报告崩溃,不确定应用程序上下文是否在此时有效?

但是,当发生崩溃时,如何将用户重定向到全局错误消息Activity?是否有一些高级方法来注册错误处理程序,以捕获所有错误并防止崩溃?有没有办法注册这样的处理程序,以便它可以防止或幸免于崩溃,然后将用户重定向到一个特定的活动,这将显示有问题的错误消息?

这是我对错误处理程序的修改:

1)只需将applicationContext构造函数作为ctx 传递给构造函数

2)添加reportError(stackTrace)方法将控制转移到错误消息页面

private void reportError(String stackTrace){
        Intent i = new Intent(ctx, DisplayErrorActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        i.setAction("DISPLAY_ERROR_ACTIVITY");
        Bundle b = new Bundle();
        b.putString("STACKTRACE", stackTrace);

        i.putExtras(b); 
        try{
             Log.d("MyErrorHandler","reportError ctx="+ctx);
             ctx.startActivity(i); 
        } catch (Exception e) {
             Exception ex = e;
             e.printStackTrace();
        }

    }
Run Code Online (Sandbox Code Playgroud)

reportError在下面打电话:

public void uncaughtException(Thread t, Throwable e) {
        Log.d("MyUncoughtExceptionHandler", "uncoughtException ctx="+ctx);
        String timestamp=getDateTime();
        final Writer result = new StringWriter();
        final PrintWriter printWriter = new PrintWriter(result);
        e.printStackTrace(printWriter);
        String stacktrace = result.toString(); …
Run Code Online (Sandbox Code Playgroud)

error-handling android crash-reports uncaught-exception

4
推荐指数
1
解决办法
9561
查看次数

将检查的异常作为RuntimeException抛出可能会导致什么问题?

我有一段代码在JSON字符串中编码某种业务数据:

public String encodeDataAsJsonString(Data data) throws JSONException {
    JSONObject o = new JSONObject();
    o.put("SomeField1", data.getSomeProperty1());
    o.put("SomeField2", data.getSomeProperty2());
    ...
    return o;
}
Run Code Online (Sandbox Code Playgroud)

事情是:

  • JSONException是一个已检查的异常,但是
  • 我真的不知道如何在编译时处理它.如果真的发生了JSONException,它可能是代码中的一个错误,应该由已经存在的常规"全局未捕获异常处理程序" (例如这个)处理,并且已经执行了所有必要的日志记录和清理.

因此,我最终在调用方法中执行此操作:

...
try {
    encoded = encodeDataAsJsonString(data);
} catch (JSONException e) {
    throw new RuntimeException(e);
}
...
Run Code Online (Sandbox Code Playgroud)

这似乎是不幸中之大幸不是添加throws JSONException每一个方法调用堆栈.但是,它仍然感觉很脏,因此我的问题是:

如果我想要一些特定的检查异常去"常规未经检查的异常路由",是否将它重新抛出为RuntimeException正确使用的习惯用法?

java exception-handling

4
推荐指数
2
解决办法
663
查看次数

如何在强制关闭对话框的确定​​按钮上发出事件

嗨,我想知道我可以在Force Close Dialog的OK按钮上执行自己的操作吗?

android

2
推荐指数
1
解决办法
1684
查看次数