16

ユーザーからのフィードバックを得る簡単な手段として、アプリでIntent.ACTION_BUG_REPORTを再利用したいと思います。

グーグルマップはそれを「フィードバック」オプションとして使用します。しかし、私はイベントの発砲に成功していません。

私は以下を使用しています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>

ただし、オプションを選択すると、画面の「点滅」以外は何も起こらないようです。アプリまたはインテントはクラッシュせず、何もログに記録されません。エミュレーターとICS4.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

これは、上記の@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;
          }
      });         

Android2.3.7および4.2.2での動作を確認しました。

メソッドが呼び出されると、sendFeedback()「使用するアクションの完了」ダイアログが開き、ユーザーは3つのアクション/アイコンから選択できます。

を使用してアクションを完了する

アプリに戻る呼び出し元のアプリ、およびGooglePlayとフィードバックエージェント。Google Play Storeまたはを選択するSend feedbackと、組み込みのAndroidフィードバックエージェントが意図したとおりに開きます。

フィードバックを送信する

「次を使用してアクションを完了する」ステップをスキップできるかどうかについては、これ以上調査していません。おそらく、に渡された正しいパラメータで可能Intentです。これまでのところ、これは私が今のところ望んでいたことを正確に実行します。

于 2013-04-26T08:55:53.143 に答える
4

Intent.ACTION_BUG_REPORT2つの異なるインテントとを混在させないでくださいIntent.ACTION_APP_ERROR。1つ目は、古いエラーの報告とフィードバック用に設計されており、APIv1からサポートされています。2つ目は、高度なエラーレポート(ApplicationErrorReport多くの有用な情報を格納できるオブジェクトをサポート)を送信するためのもので、 APIv14で追加されました。

フィードバックを送信するために、新しいバージョンのAPPで次のコードをテストしています(アクティビティのスクリーンショットも作成されます)。これが始まります。これはGooglePlayサービスcom.google.android.gms.feedback.FeedbackActivityの一部です。しかし、質問は、フィードバックをどこで見つけるかということです。

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 に答える
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インテントの使用を試みることができますが、これを機能させるには、アプリがGooglePlayストアで利用可能である必要があります。

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