Как использовать Intent.ACTION_APP_ERROR в качестве средства для платформы «обратной связи» в Android?

Я хотел бы повторно использовать Intent.ACTION_BUG_REPORT в своем приложении в качестве простого способа получения отзывов пользователей.

Карты Google используют его в качестве & quot; Отзывы & quot; вариант. Но мне не удалось запустить событие.

Я использую следующее вonOptionsItemSelected(MenuItem item):

<code>    Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
    startActivity(intent);
</code>

И по моемуAndroidManifest.xml Я объявил следующее под моимActivity:

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

Тем не менее, кажется, что ничего не происходит, кроме экрана "мигать" когда я выбираю вариант. Приложение или намерение не аварийно завершают работу, ничего не регистрируется. Пробовал как в эмуляторе, так и на устройстве ICS 4.0.4.

Я что-то упустил, но что?

Edit

Intent.ACTION_APP_ERROR (постояннаяandroid.intent.action.BUG_REPORT) был добавлен в APIlevel 14, http://developer.android.com/reference/android/content/Intent.html#ACTION_APP_ERROR

 kaderud14 сент. 2012 г., 01:48
Предполагается, что это будет тот же "код" Это происходит при сбое приложения, которое было загружено из магазина Google Play.
 TomTasche21 окт. 2012 г., 14:37
Основываясь на ответе @ bogdan, я смог придумать код, который фактически отправляет отчет о сбое на консоль разработчика Android (код, предоставленный bogdan, не работает). Вы можете найти код здесь:blog.tomtasche.at/2012/10/…
 rds07 июн. 2014 г., 19:30
Смотрите также более открытый вопросHow to send feedback который имеет более полный ответ

Ответы на вопрос(4)

Обратите внимание, что решение о сбое (как здесь) недоступно в версиях Android, выпущенных до ICS.

Короче, более простая версия решения "kaderud" (here) :

  @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
      }
    }
Решение Вопроса

Это было решено с помощью ссылки в @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;
          }
      });         
Verified working with Android 2.3.7 and 4.2.2.

КогдаsendFeedback() При вызове метода открывается диалоговое окно «Завершить действие с использованием», где пользователь может выбрать один из трех действий / значков.

Complete action using

Приложение для вызова, которое возвращается в приложение, а также Google Play и агент обратной связи. Выбор либоGoogle Play Storeили жеSend feedback откроет встроенный агент обратной связи Android как задумано.

Send feedback

Я не исследовал далее, возможно ли пропустить «полное действие», используя «-этап», возможно, с правильными параметрами, переданными вIntent, Пока что это именно то, что я хотел сейчас.

 05 мар. 2015 г., 18:28
Вы можете создать исключение, используяException error = new Exception(); вместо того, чтобы бросать настоящее исключение.
 26 сент. 2013 г., 10:17
Почему важно добавить фильтр намерений в манифест? это ваше приложение вызывает намерение, а не противоположность ... также, почему вы поделили на 0 и закрыли настройку активности?
 07 июн. 2014 г., 21:36
Как это может работать на пре-ICS, если & quot; ApplicationErrorReport & quot; класс доступен только с тех пор?

Начиная с уровня API 14, вы можете попробовать использоватьACTION_APP_ERROR намерение, но приложение должно быть доступно в магазине Google Play, чтобы это работало.

Intent intent = new Intent(Intent.ACTION_APP_ERROR);
startActivity(intent);
//must be available on play store

Пожалуйста, не смешивайте два разных намеренияIntent.ACTION_BUG_REPORT а такжеIntent.ACTION_APP_ERROR, Первый предназначен для старых сообщений об ошибках и обратной связи и поддерживаетсяAPI v1, Второй - для отправки расширенных отчетов об ошибках (поддерживаетApplicationErrorReport объект, где вы можете хранить много полезной информации) и был добавлен вAPI v14.

Для отправки отзыва я тестирую приведенный ниже код в моей новой версии приложения (он также создает скриншот активности). Это начинаетсяcom.google.android.gms.feedback.FeedbackActivity, которая является частьюGoogle Play services, Но вопрос в том, где тогда я найду отзывы ?!

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;
    }
}
 25 авг. 2015 г., 21:19
Обратная связь идет кgoogle.com/tools/feedback/android/__submit, Похоже, это внутренний сервис Google. Похоже, что нет никакого доступа к отчетам после их отправки.
 08 окт. 2016 г., 11:26
Обратная связь отправляется в консоль разработчика Google Play. Это в разделе «Ошибки и ARN».
 12 авг. 2014 г., 18:49
Если вы когда-нибудь узнаете, куда идет этот отзыв, сообщите нам. Спасибо за код!

Ваш ответ на вопрос