2016-07-14 76 views
0

我遇到了Android TV(sampleApp)的這個問題。AndroidTv,從XML問題添加頻道(samleTvApp)

我從xml文件輸入流媒體頻道。我創建了一個臨時文件用於開始,然後創建了一個按鈕,它執行所有必要的功能以從服務器獲取數據並從該數據創建新的xml文件。所有這些工作,但有一個問題:

按下按鈕和文件創建後,我嘗試通過按「添加通道」按鈕添加通道,但使用的文件是臨時文件,而不是新的xml文件。爲了使用新的xml文件,我必須重新運行安裝程序,然後它可以工作。它似乎將臨時文件緩存在內存或其他內容中,並在添加通道時首先使用它,因爲當啓動該應用程序時沒有內部存儲文件(這是我保存新建xml文件的位置),該文件僅在按鈕按下。

我如何使它所以它採用了新的XML文件,而不是臨時文件(應用程序啓動時創建)?而不是做一個重新設置

+1

,你可以發佈處理XML文件的應用程序的代碼片段? – ULazdins

回答

0

這是所使用的方法。基本上,在第一次啓動時,它會創建一個沒有頻道或程序(臨時文件)的xml,並執行所需的操作。然後使用我的其他課程,我創建了一個包含所有頻道和節目的新XML文件。這也行得通,文件存在,並且在按下「添加通道」按鈕後它會轉到else語句。但無論如何,在按下按鈕後的第一次嘗試時,它總是添加臨時文件,而不是新文件。如果我再次啓動安裝程序,則只運行新的程序。

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

該按鈕的功能是在我richSetupFragment類(我不會發布這一切,但這些都是我想在這種情況下最重要的部分):

@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

問題與權限有關嗎?在關閉應用程序後是否存在「FILENAME」? –