studio startactivity putextra intent desde boton activity abrir android android-intent

startactivity - ¿Cómo usar Intent.ACTION_APP_ERROR como un medio para un marco de "retroalimentación" en Android?



putextra android (4)

Me gustaría reutilizar Intent.ACTION_BUG_REPORT en mi aplicación, como un medio simple de obtener comentarios de los usuarios.

Google Maps lo usa como su opción "Comentarios". Pero no he tenido éxito en disparar el evento.

Estoy usando lo siguiente en onOptionsItemSelected(MenuItem item) :

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

Y en mi AndroidManifest.xml , he declarado lo siguiente en mi Activity :

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

Sin embargo, nada parece suceder además de la pantalla "parpadear" cuando selecciono la opción. La aplicación o intención no falla, no registra nada. Lo intenté tanto en el emulador como en un dispositivo ICS 4.0.4.

Estoy perdiendo algo, pero ¿qué?

Editar

Intent.ACTION_APP_ERROR (constant android.intent.action.BUG_REPORT ) se agregó en API level 14 , http://developer.android.com/reference/android/content/Intent.html#ACTION_APP_ERROR


Comenzando con el nivel 14 de la API, puede intentar usar el intento de ACTION_APP_ERROR pero la aplicación debe estar disponible en la tienda de Google Play para que esto funcione.

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


Esto fue resuelto con la ayuda del enlace en @TomTasche comentario anterior. Use el mecanismo de retroalimentación incorporado en Android .

En mi AndroidManifest.xml agregué lo siguiente a <Activity> donde deseo llamar al agente de Feedback.

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

E hice un método simple llamado sendFeedback() (código del blogpost de 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); } }

Y desde SettingsActivity lo llamo así:

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

Trabajo verificado con Android 2.3.7 y 4.2.2 .

Cuando se llama al método sendFeedback() , se abre un "diálogo de acción completa usando" donde el usuario puede seleccionar entre tres acciones / iconos.

La aplicación de llamada, que regresa a la aplicación, y Google Play y el agente de comentarios. Si seleccionas Google Play Store o Send feedback se abrirá el agente de comentarios de Android incorporado según lo previsto.

No he investigado aún más si es posible omitir el paso "Acción completa usando", probablemente sea posible con los parámetros correctos pasados ​​al Intent . Hasta ahora, esto hace exactamente lo que quería por ahora.


No mezcle dos intenciones diferentes, Intent.ACTION_BUG_REPORT e Intent.ACTION_APP_ERROR . El primero está diseñado para informes de errores antiguos y comentarios, y es compatible con API v1 . El segundo es para enviar informes de errores avanzados (admite el objeto ApplicationErrorReport donde puede almacenar mucha información útil) y se agregó en API v14 .

Para enviar comentarios, estoy probando el código inferior en mi nueva versión de la aplicación (también crea una captura de pantalla de la actividad). Esto inicia com.google.android.gms.feedback.FeedbackActivity , que es parte de los servicios de Google Play . ¡Pero la pregunta es dónde entonces encontraré las regeneraciones ?!

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; } }


Tenga en cuenta que la solución de informe de fallos (como aquí) no está disponible en versiones anteriores a ICS de Android.

Una versión más corta y simple de la solución de "kaderud" ( aquí ):

@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 } }