AndroidTv,从XML问题添加频道(samleTvApp)

时间:2016-07-14 06:48:02

标签: android android-tv

我在Android TV(sampleApp)中遇到此问题。

我正在从xml文件输入流媒体频道。我正在创建一个在开始时使用的临时文件,然后我创建了一个按钮,它执行所有必要的功能,从服务器获取数据并从该数据创建新的xml文件。所有这些都有效,但有一个问题:

按下按钮并创建文件后,我尝试按“添加频道”按钮添加频道,但使用的文件是临时文件,而不是新的xml文件。因此,它使用NEW xml文件,我必须重新运行安装程序,然后它会发挥作用。它似乎将临时文件缓存在内存或其他东西中,并在添加频道时首先使用它,因为当启动应用程序时,没有内部存储文件(这是我保存新的xml文件的地方),该文件仅在之后创建按下按钮。

如何制作它以便它使用新的xml文件而不是临时文件(在应用程序启动期间创建)?而不是重新设置

1 个答案:

答案 0 :(得分: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);
        }
    }