2016-07-14 1 views
0

Je rencontre ce problème avec Android TV (sampleApp).AndroidTv, Ajout de chaînes à partir d'un problème XML (samleTvApp)

Je saisis des canaux de diffusion à partir d'un fichier XML. Je crée un fichier temporaire à utiliser au début, puis j'ai créé un bouton qui fait toutes les fonctions nécessaires pour acquérir des données du serveur et créer le nouveau fichier xml à partir de ces données. Tout cela fonctionne, mais il y a un problème:

Après avoir appuyé sur le bouton et le fichier est créé, j'essaie d'ajouter des canaux en appuyant sur le bouton "Ajouter des canaux", mais le fichier utilisé est le fichier temporaire, pas le NOUVEAU fichier xml. Pour qu'il utilise le nouveau fichier xml, je dois réexécuter l'installation, puis cela fonctionne mal. Il semble qu'il met en cache le fichier temporaire en mémoire ou quelque chose et l'utilise en premier lors de l'ajout de canaux, car lorsque l'application est lancée il n'y a pas de fichier de stockage interne (c'est là que je sauvegarde mon nouveau fichier xml) le bouton presse.

Comment puis-je faire pour qu'il utilise le nouveau fichier xml au lieu du fichier temporaire (qui a créé lors du lancement de l'application) ?, au lieu de faire une nouvelle configuration

+1

pourrait vous envoyer un extrait de code de votre application qui traite des fichiers XML? – ULazdins

Répondre

0

Ceci est la méthode qui est utilisée. Fondamentalement, au premier lancement, il crée un fichier XML sans canaux ni programmes (le fichier temporaire) et fait ce qu'il doit faire. Puis, en utilisant mon autre classe, je crée un nouveau fichier XML avec tous les canaux et programmes. Cela fonctionne également, le fichier existe et il va à l'instruction else après avoir appuyé sur le bouton "Ajouter des canaux". Mais peu importe, au premier essai après avoir appuyé sur le bouton, il ajoute toujours le fichier temporaire, plutôt que le nouveau. Le nouveau n'est exécuté que si je lance la configuration à nouveau.

 public static XmlTvParser.TvListing getRichTvListings(Context context) { 
     context1 = context; 
     FileOutputStream fos; 

     try { 
      Boolean exists = context.getFileStreamPath(FILENAME).exists(); 
      if (exists == false){ 
       String string = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + 
         "<!DOCTYPE tv SYSTEM \"xmltv.dtd\">\n" + 
         "\n" + 
         "<tv>\n" + 
         "</tv>"; 

       Log.d(TAG,"Exists: FALSE"); 
       fos = context.openFileOutput(FILENAME, Context.MODE_PRIVATE); 
       fos.write(string.getBytes()); 
       fos.close(); 

       read = "file:" + context.getFilesDir().toString() + "/" + FILENAME ; 

       Uri catalogUri =Uri.parse(read); 

       if (sSampleTvListing != null) { 
        return sSampleTvListing; 
       } 

       try (InputStream inputStream = getInputStream(context, catalogUri)) { 
        sSampleTvListing = XmlTvParser.parse(inputStream); 
       } catch (IOException e) { 
        Log.e(TAG, "Error in fetching " + catalogUri, e); 
       } 

      } 
      else{ 
       Log.d(TAG,"Exists: TRUE"); 
       FileInputStream fis = context.openFileInput(FILENAME2); 
       StringBuilder builder = new StringBuilder(); 
       int inputChar; 
       while((inputChar = fis.read()) != -1) { 
        builder.append((char) inputChar); 
       } 
       String readFile = builder.toString(); 
       Log.d(TAG, "FileContent: " + readFile); 

       read = "file:" + context.getFilesDir().toString() + "/" + FILENAME2 ; 

       Uri catalogUri =Uri.parse(read); 

       if (sSampleTvListing != null) { 
        return sSampleTvListing; 
       } 

       try (InputStream inputStream = getInputStream(context, catalogUri)) { 
        sSampleTvListing = XmlTvParser.parse(inputStream); 
       } catch (IOException e) { 
        Log.e(TAG, "Error in fetching " + catalogUri, e); 
       } 

      } 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 


     return sSampleTvListing; 
    } 

Les fonctionnalités des boutons sont dans ma classe richSetupFragment (je ne vais pas poster tout cela, mais ce sont la partie que je pense sont les plus importants dans ce cas):

@Override 
     protected Boolean doInBackground(Uri... params) { 

      mTvListing = RichFeedUtil.getRichTvListings(getActivity()); 
      mPoster = fetchPoster(); 
      return true; 
     } 

@Override 
       public void onActionClicked(Action action) { 
        if (action.getId() == ACTION_ADD_CHANNELS) { 
         setupChannels(mInputId); 
        } else if (action.getId() == ACTION_CANCEL) { 
         getActivity().finish(); 
        } 
        else if (action.getId() == RETRIEVE_DATA) { 

         getChannelsFromServer(); 

         // Log.d(TAG,"List: " + list); 
        } 
private void setupChannels(String inputId) { 

     inputIdLocal= inputId; 
     if (mTvListing == null) { 
      onError(R.string.feed_error_message); 
      return; 
     } 
     TvContractUtils.updateChannels(getActivity(), inputId, mTvListing.channels); 
     SyncUtils.setUpPeriodicSync(getActivity(), inputId); 
     SyncUtils.requestSync(inputId, true); 
     mSyncRequested = true; 
     // Watch for sync state changes 
     if (mSyncObserverHandle == null) { 
      final int mask = ContentResolver.SYNC_OBSERVER_TYPE_PENDING | 
        ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE; 
      mSyncObserverHandle = ContentResolver.addStatusChangeListener(mask, 
        mSyncStatusObserver); 
     } 
    } 
+0

Le problème est-il lié aux autorisations? Est-ce que 'FILENAME' existe après la fermeture de l'application? –