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

16

Я хотел бы повторно использовать 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

Смотрите также более открытый вопросHow to send feedback который имеет более полный ответ rds
Предполагается, что это будет тот же "код" Это происходит при сбое приложения, которое было загружено из магазина Google Play. kaderud
Основываясь на ответе @ bogdan, я смог придумать код, который фактически отправляет отчет о сбое на консоль разработчика Android (код, предоставленный bogdan, не работает). Вы можете найти код здесь:blog.tomtasche.at/2012/10/… TomTasche

Ваш Ответ

4   ответа
1

Обратите внимание, что решение о сбое (как здесь) недоступно в версиях 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
      }
    }
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;
          }
      });         

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, Пока что это именно то, что я хотел сейчас.

Как это может работать на пре-ICS, если & quot; ApplicationErrorReport & quot; класс доступен только с тех пор?
Вы можете создать исключение, используяException error = new Exception(); вместо того, чтобы бросать настоящее исключение.
Почему важно добавить фильтр намерений в манифест? это ваше приложение вызывает намерение, а не противоположность ... также, почему вы поделили на 0 и закрыли настройку активности?
0

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

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

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

Похожие вопросы