16

我想在我的应用程序中重用 Intent.ACTION_BUG_REPORT,作为获取用户反馈的简单方法。

谷歌地图使用它作为他们的“反馈”选项。但是我没有成功触发该事件。

我在 a 中使用以下内容onOptionsItemSelected(MenuItem item)

    Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
    startActivity(intent);

在我AndroidManifest.xml的下面我声明了以下内容Activity

    <intent-filter>
       <action android:name="android.intent.action.BUG_REPORT" />
       <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

但是,当我选择该选项时,除了屏幕“闪烁”之外似乎什么都没有发生。应用程序或意图不会崩溃,它不会记录任何内容。在模拟器和 ICS 4.0.4 设备上都试过了。

我显然错过了一些东西,但是什么?

编辑

Intent.ACTION_APP_ERROR(常量android.intent.action.BUG_REPORT)在 API 中添加level 14http://developer.android.com/reference/android/content/Intent.html#ACTION_APP_ERROR

4

4 回答 4

4

请不要将两种不同的意图Intent.ACTION_BUG_REPORTIntent.ACTION_APP_ERROR. 第一个是为旧的错误报告和反馈而设计的,它受API v1的支持。第二个是用于发送高级错误报告(支持ApplicationErrorReport可以存储大量有用信息的对象)并添加到API v14中。

为了发送反馈,我正在我的新版 APP 中测试以下代码(它还创建了活动的屏幕截图)。这开始com.google.android.gms.feedback.FeedbackActivity了,它是Google Play 服务的一部分。但问题是我在哪里可以找到反馈?!

protected void sendFeedback(Activity activity) {
    activity.bindService(new Intent(Intent.ACTION_BUG_REPORT), new FeedbackServiceConnection(activity.getWindow()), BIND_AUTO_CREATE);
}

protected static class FeedbackServiceConnection implements ServiceConnection {
    private static int MAX_WIDTH = 600;
    private static int MAX_HEIGHT = 600;

    protected final Window mWindow;

    public FeedbackServiceConnection(Window window) {
        this.mWindow = window;
    }

    public void onServiceConnected(ComponentName name, IBinder service) {
        try {
            Parcel parcel = Parcel.obtain();
            Bitmap bitmap = getScreenshot();
            if (bitmap != null) {
                bitmap.writeToParcel(parcel, 0);
            }
            service.transact(IBinder.FIRST_CALL_TRANSACTION, parcel, null, 0);
            parcel.recycle();
        } catch (RemoteException e) {
            Log.e("ServiceConn", e.getMessage(), e);
        }
    }

    public void onServiceDisconnected(ComponentName name) { }

    private Bitmap getScreenshot() {
        try {
            View rootView = mWindow.getDecorView().getRootView();
            rootView.setDrawingCacheEnabled(true);
            Bitmap bitmap = rootView.getDrawingCache();
            if (bitmap != null)
            {
                double height = bitmap.getHeight();
                double width = bitmap.getWidth();
                double ratio = Math.min(MAX_WIDTH / width, MAX_HEIGHT / height);
                return Bitmap.createScaledBitmap(bitmap, (int)Math.round(width * ratio), (int)Math.round(height * ratio), true);
            }
        } catch (Exception e) {
            Log.e("Screenshoter", "Error getting current screenshot: ", e);
        }
        return null;
    }
}
于 2014-03-03T20:40:17.700 回答
4

这在上面@TomTasche 评论中的链接的帮助下得到了解决。在 Android 上使用内置的反馈机制

在我的中,AndroidManifest.xml我将以下内容添加到<Activity>我想从中调用反馈代理的位置。

<intent-filter>
   <action android:name="android.intent.action.APP_ERROR" />
   <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

我做了一个简单的方法,叫做sendFeedback()(来自 TomTasche 博客文章的代码)

@SuppressWarnings("unused")
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
private void sendFeedback() {
    try {
        int i = 3 / 0;
    } catch (Exception e) {
    ApplicationErrorReport report = new ApplicationErrorReport();
    report.packageName = report.processName = getApplication().getPackageName();
    report.time = System.currentTimeMillis();
    report.type = ApplicationErrorReport.TYPE_CRASH;
    report.systemApp = false;

    ApplicationErrorReport.CrashInfo crash = new ApplicationErrorReport.CrashInfo();
    crash.exceptionClassName = e.getClass().getSimpleName();
    crash.exceptionMessage = e.getMessage();

    StringWriter writer = new StringWriter();
    PrintWriter printer = new PrintWriter(writer);
    e.printStackTrace(printer);

    crash.stackTrace = writer.toString();

    StackTraceElement stack = e.getStackTrace()[0];
    crash.throwClassName = stack.getClassName();
    crash.throwFileName = stack.getFileName();
    crash.throwLineNumber = stack.getLineNumber();
    crash.throwMethodName = stack.getMethodName();

    report.crashInfo = crash;

    Intent intent = new Intent(Intent.ACTION_APP_ERROR);
    intent.putExtra(Intent.EXTRA_BUG_REPORT, report);
    startActivity(intent);
    }
}

从我的角度来看,SettingsActivity我称之为:

      findPreference(sFeedbackKey).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
          public final boolean onPreferenceClick(Preference paramAnonymousPreference) {
              sendFeedback();
              finish();
              return true;
          }
      });         

经验证可与 Android 2.3.74.2.2一起使用。

sendFeedback()调用该方法时,会打开一个“使用完成操作”对话框,用户可以在其中从三个操作/图标中进行选择。

使用完成动作

返回到应用程序的调用应用程序,以及 Google Play 和反馈代理。选择Google Play StoreSend feedback将按预期打开内置 Android 反馈代理。

发送反馈

如果可以跳过“使用完成操作”步骤,我还没有进一步调查,可能通过将正确的参数传递给Intent. 到目前为止,这正是我现在想要的。

于 2013-04-26T08:55:53.143 回答
1

请注意,崩溃报告解决方案(如此处)不适用于 ICS 之前的 Android 版本。

“kaderud”解决方案的更短、更简单的版本(此处):

  @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
  private void sendFeedback()
    {
    final Intent intent=new Intent(Intent.ACTION_APP_ERROR);
    final ApplicationErrorReport report=new ApplicationErrorReport();
    report.packageName=report.processName=getApplication().getPackageName();
    report.time=System.currentTimeMillis();
    report.type=ApplicationErrorReport.TYPE_NONE;
    intent.putExtra(Intent.EXTRA_BUG_REPORT,report);
    final PackageManager pm=getPackageManager();
    final List<ResolveInfo> resolveInfos=pm.queryIntentActivities(intent,0);
    if(resolveInfos!=null&&!resolveInfos.isEmpty())
      {
      for(final ResolveInfo resolveInfo : resolveInfos)
        {
        final String packageName=resolveInfo.activityInfo.packageName;
        // prefer google play app for sending the feedback:
        if("com.android.vending".equals(packageName))
          {
          // intent.setPackage(packageName);
          intent.setClassName(packageName,resolveInfo.activityInfo.name);
          break;
          }
        }
      startActivity(intent);
      }
    else
      {
      // handle the case of not being able to send feedback
      }
    }
于 2014-06-07T19:53:04.723 回答
0

从 API 级别 14 开始,您可以尝试使用该ACTION_APP_ERROR意图,但该应用程序需要在 Google Play 商店中可用才能正常工作。

Intent intent = new Intent(Intent.ACTION_APP_ERROR);
startActivity(intent);
//must be available on play store
于 2012-10-07T00:26:18.807 回答