2016-11-20 2 views
1

J'ai construit une application avec la possibilité d'ajouter des widgets à l'écran d'accueil. Le widget fonctionne avec mon Nexus 6P et un Motorola Moto G3.Android - Samsung: Création de Widget avec l'activité de configuration échoue

Avec les téléphones Samsung (testé avec S3 mini (4.1.2), S5, S6 (6.0.1)) le widget n'est pas ajouté du tout ou les plantages de TouchWiz.

Avec un autre lanceur (Nova), le widget n'est pas non plus créé sur le S3 mini.

Dans logcat, je ne vois aucun message d'erreur.

J'ai essayé de réduire le problème autant que possible. Le widget est créé si je supprime le android:configure="de.cliff.strichliste.widgets.WidgetConfigurationActivity" du fichier counter_widget_info.xml. Si je veux utiliser une activité de configuration TouchWiz se bloque sur le Samsung S3 mini.

<?xml version="1.0" encoding="utf-8"?> 
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minWidth="40dp" 
    android:minHeight="40dp" 
    android:configure="de.cliff.strichliste.widgets.WidgetConfigurationActivity" 
    android:updatePeriodMillis="1800000" 
    android:initialLayout="@layout/widget_counter" 
    android:resizeMode="horizontal|vertical" 
    android:widgetCategory="home_screen" 
    android:previewImage="@drawable/widget_preview"> 
</appwidget-provider> 

Dans le AndroidManifest.xml je me inscrire le widget avec les lignes suivantes:

<receiver 
      android:name=".widgets.CounterWidgetProvider"> 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      </intent-filter> 
      <meta-data 
       android:name="android.appwidget.provider" 
       android:resource="@xml/counter_widget_info" /> 
</receiver> 

Du côté Java, j'ai ce qui suit dans le WidgetConfigurationActivity:

public class WidgetConfigurationActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     WidgetConfigurationBinding binding = DataBindingUtil.setContentView(this, R.layout.widget_configuration); 
     setResult(RESULT_OK); 
    } 
} 

Et ceci dans la classe WidgetProvider:

public class CounterWidgetProvider extends AppWidgetProvider { 
@Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     super.onUpdate(context, appWidgetManager, appWidgetIds); 
     Intent intent = new Intent(context, CounterWidgetProvider.class); 
     context.startService(intent); 
    } 
} 
+0

Juste une tête: j'ai remarqué un comportement étrange, je crois des tests que je courais qui a provoqué la plante TouchWiz. Après le redémarrage, il semble que TouchWiz soit resté en quelque sorte sur des références pour des widgets qui ne sont jamais parvenus à l'écran d'accueil, et a commencé à diffuser des mises à jour pour eux. Je viens juste de le remarquer parce que j'ai fait des tests avec un projet de widget préexistant qui se met à jour assez fréquemment, et montre un toast à chaque fois. Vous voudrez peut-être effectuer une désinstallation complète sur tous les appareils sur lesquels vous avez effectué le test, afin de le supprimer, avant de poursuivre les tests. –

Répondre

2

De tester sur mes propres appareils Samsung, il semble que le problème est que TouchWiz étouffe si le résultat Intent n'a pas l'ID de l'application Widget, même si c'est RESULT_CANCELLED.

De the App Widget developer page:

  • L'activité hôte Widget App appelle l'activité de configuration et la configuration doit toujours retourner un résultat. Le résultat doit inclure l'ID du widget d'application transmis par l'intention ayant lancé l'activité (enregistré dans les extras d'intention sous la forme EXTRA_APPWIDGET_ID).

On ne sait pas comment vous voulez exactement à gérer en fin de compte le résultat, mais il est certainement une bonne idée d'aller de l'avant et définir un résultat valable dans onCreate(), dans le cas où le dos de l'utilisateur de la configuration Activity. Par exemple:

final int id = getIntent().getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0); 
final Intent result = new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id); 
setResult(RESULT_OK, result);