Giter VIP home page Giter VIP logo

androidtv-sample-inputs's Introduction

Sample Android TV Channel App (TV Input) using TIF

This app is designed to show how to build live TV channel apps for Android TV using the TV Input Framework (TIF). The sample is a service that once installed, is recognized and run by the default TV app (e.g. Live Channels app).

Introduction

The sample app consists of a single TV input: 4 channels consisting of MP4 videos, HLS stream and MPEG-DASH stream, organized into various genres. The video files are served from Google Cloud Storage.

References and Developer Guides

TIF Companion Library

This app uses the TIF Companion Library. The source code for the library is in the library directory. To use this library in your project, copy the directory over or use the following Gradle dependency:

compile 'com.google.android.libraries.tv:companionlibrary:0.4.1'

Pre-requisites

Getting Started

Note that the Live Channels app does not show up in Apps on Home screen unless there is at least one TV input service or a physical input like HDMI1.

To set up the TV input:

  • Start Live Channels app
  • Click Search to search for and add channels
  • Alternatively within Live Channels app,
    • Click ENTER to bring out Recent Channels
    • Click DOWN to enter TV options
    • Click RIGHT to Channel sources and select it
    • Click DOWN to select Rich Input and click ENTER to select it
    • Click ADD CHANNELS NOW to add channels of MP4 videos, HLS stream and MPEG-DASH stream
  • To watch sample channels, simply toggle UP and DOWN to switch channels
  • Visit Channel Sources -> Rich Input -> Settings to see mock options for input settings.

Screenshots

TV program guide TV options TV options:channel sources Add Rich TV Input

Support

License

License under the Apache 2.0 license. See the LICENSE file for details.

How to make contributions?

Please read and follow the steps in the CONTRIBUTING.md

Notice

Images/videos used in this sample are courtesy of the Blender Foundation, shared under copyright or Creative Commons license.

  • Elephant's Dream: (c) copyright 2006, Blender Foundation / Netherlands Media Art Institute / www.elephantsdream.org
  • Sintel: (c) copyright Blender Foundation | www.sintel.org
  • Tears of Steel: (CC) Blender Foundation | mango.blender.org
  • Big Buck Bunny: (c) copyright 2008, Blender Foundation / www.bigbuckbunny.org

androidtv-sample-inputs's People

Contributors

chalko avatar drchen avatar flamme avatar fleker avatar guangstick avatar jaewan-github avatar naokigoogle avatar ryanseys avatar shawngit avatar smishra2 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

androidtv-sample-inputs's Issues

Multitrack support

Hello All,
I’m trying to adopt that code to my project. My development device is ADT-1 Google’s box.
Within 2 month I managed to port it to Exoplayer 1.4.2 and then to 1.5.0 version.
The first port has brought many changes in the code while the second one was most painful since the code was almost similar but did not work. It turned out that reverting commend call sequence solved my pain.
Since Exo 1.5.0 supports multitrack I wanted to implement it in my project.
Question is where to define the tracks.
I put the fake data in mTvTracks in the “prepare” method in TvInputPlayer since this method calls prepareInternal and one calls onPrepared and finally onPreapred in RichTvinputService contains notifyTracksChanged(tracks) and notifyTrackSelected(). (BTW the track data was fake since that was too early to get tracks data from mPlayer which are set when the first frame is drawn. So this is another issue where to set tracks using latest Exopalyer). But the main point here is that after setting tracks and calling onPrepared, the “prepare” method is called once again, many times. So playback brakes for each call and finally the screen is black.
According this (https://developer.android.com/training/tv/tif/ui.html) the notifyTracksChanged() can be called whenever there is a change in track information. But it recursively invokes the player start.
Can you comment/fix on this.
Regards,
Paul

DuplicateRelativeFileException: More than one file was found with OS independent path

When trying to build my project with the dependency:

com.google.android.libraries.tv:companionlibrary:0.2

I get the following error:

Error:com.android.builder.merge.DuplicateRelativeFileException: More than one file was found with OS independent path 'third_party/java_src/error_prone/project/annotations/Annotations.gwt.xml'

I looks like this file is inside the com.google.ads.interactivemedia.v3:interactivemedia library that the companionlibrary depends on.

I tried to exclude it:

implementation('com.google.android.libraries.tv:companionlibrary:0.2') {
        exclude group: 'com.google.android.gms', module: 'play-services-ads'
        exclude group: 'com.google.ads.interactivemedia.v3', module: 'interactivemedia'
    }

But then it fails in onCreateSession with:
java.lang.Class<com.google.android.media.tv.companionlibrary.AdController>: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/ads/interactivemedia/v3/api/AdErrorEvent$AdErrorListener;

Not working Google TV

So i'm trying to get the input framework to work with Google TV running on Chromecast, however my channels are not being added to the input framework database.

My Input service shows as "no channels available"

Running on Android TV 10 build QTRS1.210311.005.7231359

ContentProvider Error

Hello
I am trying to create a content provider to get info from the database and display it in a listview but when I used the provider nothing diplayed in the list and I got this error in the logcat :
2019-02-02 14:06:38.195 1294-1331/com.example.android.pet E/ActivityThread: Failed to find provider info for com.example.android.pets

Here is the manifest:
`

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".EditorActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity" />
    </activity>

    <provider
        android:name=".data.PetProvider"
        android:authorities="com.example.android.pet"
        android:enabled="true"
        android:exported="false"></provider>
</application>

`

and here is the query method in the provider:

private PetDbHelper petDbHelper; public static final String LOG_TAG = PetProvider.class.getSimpleName(); private static final int PETS = 100; private static final int PET_ID = 101; private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); static { sUriMatcher.addURI(PetContract.CONTENT_AUTHORITY, PetContract.PATH_PETS, PETS); sUriMatcher.addURI(PetContract.CONTENT_AUTHORITY, PetContract.PATH_PETS + "/#", PET_ID); } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase database = petDbHelper.getReadableDatabase(); Cursor cursor; int match = sUriMatcher.match(uri); switch (match) { case PETS: cursor = database.query(PetContract.PetEntry.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder); break; case PET_ID: selection = PetContract.PetEntry._ID + "=?"; selectionArgs = new String[] { String.valueOf(ContentUris.parseId(uri)) }; cursor = database.query(PetContract.PetEntry.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder); break; default: throw new IllegalArgumentException("Cannot query unknown URI " + uri); } return cursor; }

Please help me , and thanks

TvInputService.Session KeyEvent.Callbacks Never Called

It appears the KeyEvent.Callbacks (onKeyDown, onKeyUp, etc) defined in TvInputService.Session never get called.

I've tried modifying RichTvInputService to override these methods and never see them fired.

The window that holds mOverlayView appears never to get focus even after removing the FLAG_NOT_FOCUSABLE flag so no way to hear KeyEvents via the mOverlayView either.

It appears there is supposed to be a way to capture key events in the TvInputService before the key events are handled by the application as the onKeyDown, onKeyUp, onKeyLongPress are defined in TvInputServices.Session. Is this just not implemented yet?

How to run the sample on Android TV Emulator?

Can anyone help me to run the sample app on Android TV API 28 Emulator?
As per the Readme, I am not able to get the Live Channels app to appear though I see it installed as one of the system app.

How to customize layout by new xml?

On the system TV app presents channel, I want to change logo, channel number, channel title position and background color.

Please some help me how could I achieved this.

Unable to buil sample

I'm getting error message:

More than one file was found with OS independent path 'error_prone/Annotations.gwt.xml'

Use current ExoPlayer for Rich sample

At present, this is using a bundled version of ExoPlayer 1.2.4. ExoPlayer 1.5.5 is out, and supports more codecs. These codecs are required for some IPTV services.

ExoPlayer is pretty much required for any sort of remote streaming setup, as MediaPlayer is extremely sensitive to latency and has small and unconfigurable buffers. Ideally, the Simple sample should also use ExoPlayer.

This other project by @Fleker appears to have an implementation of TvInputPlayer which works with ExoPlayer 1.5.3, but not 1.5.5:

https://github.com/Fleker/CumulusTV/blob/master/app/src/main/java/com/example/android/sampletvinput/player/TvInputPlayer.java

However, it does not support subtitles.

Note: I am not affiliated with the author of the other project, just been banging my head trying to get progressive HTTP streaming via udpxy working reliably for the last few hours... 😞

Error during the compilation of the project

org.gradle.api.ProjectConfigurationException: A problem occurred configuring project ':app'. at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:79) at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:74) at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:61) at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:540) at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:93) at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:47) at org.gradle.execution.TaskSelector.getSelection(TaskSelector.java:84) at org.gradle.execution.TaskSelector.getSelection(TaskSelector.java:75) at org.gradle.execution.commandline.CommandLineTaskParser.parseTasks(CommandLineTaskParser.java:42) at org.gradle.execution.TaskNameResolvingBuildConfigurationAction.configure(TaskNameResolvingBuildConfigurationAction.java:44) at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48) at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:25) at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:54) at org.gradle.execution.DefaultTasksBuildExecutionAction.configure(DefaultTasksBuildExecutionAction.java:44) at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48) at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:25) at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:54) at org.gradle.execution.ExcludedTaskFilteringBuildConfigurationAction.configure(ExcludedTaskFilteringBuildConfigurationAction.java:47) at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48) at org.gradle.execution.DefaultBuildConfigurationActionExecuter.select(DefaultBuildConfigurationActionExecuter.java:36) at org.gradle.initialization.DefaultGradleLauncher$3.run(DefaultGradleLauncher.java:142) at org.gradle.internal.Factories$1.create(Factories.java:22) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:53) at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:139) at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:32) at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:98) at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:92) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:63) at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:92) at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:83) at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:99) at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:46) at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35) at org.gradle.tooling.internal.provider.runner.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:58) at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35) at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:48) at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30) at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:81) at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:46) at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:52) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74) at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72) at org.gradle.util.Swapper.swap(Swapper.java:38) at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50) at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:237) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54) at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: org.gradle.api.ProjectConfigurationException: A problem occurred configuring project ':library'. at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:79) at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:57) at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:540) at org.gradle.api.internal.project.AbstractProject.evaluationDependsOn(AbstractProject.java:612) at org.gradle.api.internal.project.AbstractProject.evaluationDependsOn(AbstractProject.java:604) at com.android.build.gradle.internal.DependencyManager.ensureConfigured(DependencyManager.java:488) at com.android.build.gradle.internal.DependencyManager.resolveDependencyForConfig(DependencyManager.java:267) at com.android.build.gradle.internal.DependencyManager.resolveDependencies(DependencyManager.java:159) at com.android.build.gradle.internal.TaskManager.resolveDependencies(TaskManager.java:364) at com.android.build.gradle.internal.VariantManager$9.call(VariantManager.java:636) at com.android.build.gradle.internal.VariantManager$9.call(VariantManager.java:633) at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:156) at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:120) at com.android.build.gradle.internal.profile.SpanRecorders.record(SpanRecorders.java:44) at com.android.build.gradle.internal.VariantManager.createVariantData(VariantManager.java:629) at com.android.build.gradle.internal.VariantManager.createVariantDataForProductFlavors(VariantManager.java:823) at com.android.build.gradle.internal.VariantManager.populateVariantDataList(VariantManager.java:494) at com.android.build.gradle.internal.VariantManager$1.call(VariantManager.java:269) at com.android.build.gradle.internal.VariantManager$1.call(VariantManager.java:266) at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:156) at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:120) at com.android.build.gradle.internal.VariantManager.createAndroidTasks(VariantManager.java:265) at com.android.build.gradle.BasePlugin$11.call(BasePlugin.java:688) at com.android.build.gradle.BasePlugin$11.call(BasePlugin.java:685) at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:156) at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:120) at com.android.build.gradle.BasePlugin.createAndroidTasks(BasePlugin.java:683) at com.android.build.gradle.BasePlugin$10.call(BasePlugin.java:608) at com.android.build.gradle.BasePlugin$10.call(BasePlugin.java:605) at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:156) at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:120) at com.android.build.gradle.BasePlugin.lambda$createTasks$1(BasePlugin.java:603) at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:93) at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:82) at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:44) at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:79) at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:30) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) at com.sun.proxy.$Proxy11.afterEvaluate(Unknown Source) at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:67) ... 70 more Caused by: org.gradle.internal.exceptions.LocationAwareException: Build file 'F:\Downloads\androidtv-sample-inputs-master\androidtv-sample-inputs-master\library\build.gradle' line: 2 Error resolving plugin [id: 'com.jfrog.bintray', version: '1.7'] at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.resolveToFoundResult(DefaultPluginRequestApplicator.java:228) at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.access$000(DefaultPluginRequestApplicator.java:62) at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator$1.transform(DefaultPluginRequestApplicator.java:87) at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator$1.transform(DefaultPluginRequestApplicator.java:85) at org.gradle.util.CollectionUtils.collect(CollectionUtils.java:188) at org.gradle.util.CollectionUtils.collect(CollectionUtils.java:183) at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugins(DefaultPluginRequestApplicator.java:85) at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:157) at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:38) at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:25) at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:34) at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:55) ... 108 more Caused by: org.gradle.api.GradleException: Error resolving plugin [id: 'com.jfrog.bintray', version: '1.7'] ... 120 more Caused by: org.gradle.api.GradleException: Plugin cannot be resolved from https://plugins.gradle.org/api/gradle because Gradle is running in offline mode at org.gradle.plugin.use.resolve.service.internal.OfflinePluginResolutionServiceClient.queryPluginMetadata(OfflinePluginResolutionServiceClient.java:26) at org.gradle.plugin.use.resolve.service.internal.PersistentCachingPluginResolutionServiceClient$1.create(PersistentCachingPluginResolutionServiceClient.java:60) at org.gradle.plugin.use.resolve.service.internal.PersistentCachingPluginResolutionServiceClient$1.create(PersistentCachingPluginResolutionServiceClient.java:58) at org.gradle.plugin.use.resolve.service.internal.PersistentCachingPluginResolutionServiceClient.fetch(PersistentCachingPluginResolutionServiceClient.java:110) at org.gradle.plugin.use.resolve.service.internal.PersistentCachingPluginResolutionServiceClient.maybeFetch(PersistentCachingPluginResolutionServiceClient.java:103) at org.gradle.plugin.use.resolve.service.internal.PersistentCachingPluginResolutionServiceClient.maybeFetch(PersistentCachingPluginResolutionServiceClient.java:91) at org.gradle.plugin.use.resolve.service.internal.PersistentCachingPluginResolutionServiceClient.queryPluginMetadata(PersistentCachingPluginResolutionServiceClient.java:67) at org.gradle.plugin.use.resolve.service.internal.InMemoryCachingPluginResolutionServiceClient$1.create(InMemoryCachingPluginResolutionServiceClient.java:47) at org.gradle.plugin.use.resolve.service.internal.InMemoryCachingPluginResolutionServiceClient$1.create(InMemoryCachingPluginResolutionServiceClient.java:45) at org.gradle.plugin.use.resolve.service.internal.InMemoryCachingPluginResolutionServiceClient.getResponse(InMemoryCachingPluginResolutionServiceClient.java:76) at org.gradle.plugin.use.resolve.service.internal.InMemoryCachingPluginResolutionServiceClient.queryPluginMetadata(InMemoryCachingPluginResolutionServiceClient.java:42) at org.gradle.plugin.use.resolve.service.internal.DeprecationListeningPluginResolutionServiceClient.queryPluginMetadata(DeprecationListeningPluginResolutionServiceClient.java:48) at org.gradle.plugin.use.resolve.service.internal.PluginResolutionServiceResolver.resolve(PluginResolutionServiceResolver.java:84) at org.gradle.plugin.use.resolve.internal.CompositePluginResolver.resolve(CompositePluginResolver.java:33) at org.gradle.plugin.use.resolve.internal.NotNonCorePluginOnClasspathCheckPluginResolver.resolve(NotNonCorePluginOnClasspathCheckPluginResolver.java:42) at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.resolveToFoundResult(DefaultPluginRequestApplicator.java:226) ... 119 more

I am getting this issue while compiling the project in Latest Android Studio version 3.1.0 with the mentioned gradle in your project file.

How to use the internal tv tuner

I wish to know if it's possible to use this app with the android device's internal tv tuner, and, if possible, how to do it.
I am seeking for any code to test and understand how to do it, but haven't found any help anywhere.

Thanks for any help

installed app in android tv show only webpage conent

10-11 15:11:31.808 27043-27043/? E/libprocessgroup: failed to make and chown /acct/uid_10156: Read-only file system
10-11 15:11:31.809 27043-27043/? W/Zygote: createProcessGroup failed, kernel missing CONFIG_CGROUP_CPUACCT?
10-11 15:11:31.810 27043-27043/? I/art: Late-enabling -Xcheck:jni
10-11 15:11:31.841 27043-27043/? E/Environment: canonicalPath = /storage/sdcard
10-11 15:11:32.491 27043-27043/com.example.android.sampletvinput I/InstantRun: starting instant run server: is main process
10-11 15:11:32.535 27043-27043/com.example.android.sampletvinput D/WebView: loading library -- infrared!
10-11 15:11:32.600 27043-27043/com.example.android.sampletvinput I/WebViewFactory: Loading com.android.webview version 39 (2016-07-08.150512-arm) (code 300001)
10-11 15:11:32.611 27043-27043/com.example.android.sampletvinput I/LibraryLoader: Time to load native libraries: 4 ms (timestamps 1863-1867)
10-11 15:11:32.611 27043-27043/com.example.android.sampletvinput I/LibraryLoader: Expected native library version number "",actual native library version number ""
10-11 15:11:32.621 27043-27043/com.example.android.sampletvinput V/WebViewChromiumFactoryProvider: Binding Chromium to main looper Looper (main, tid 1) {2ff369f0}
10-11 15:11:32.621 27043-27043/com.example.android.sampletvinput I/LibraryLoader: Expected native library version number "",actual native library version number ""
10-11 15:11:32.621 27043-27043/com.example.android.sampletvinput I/chromium: [INFO:library_loader_hooks.cc(104)] Chromium logging enabled: level = 0, default verbosity = 0
10-11 15:11:32.630 27043-27043/com.example.android.sampletvinput I/BrowserStartupController: Initializing chromium process, singleProcess=true
10-11 15:11:32.630 27043-27043/com.example.android.sampletvinput W/art: Attempt to remove local handle scope entry from IRT, ignoring
10-11 15:11:32.639 27043-27075/com.example.android.sampletvinput W/AudioManagerAndroid: Requires BLUETOOTH permission
10-11 15:11:32.640 27043-27043/com.example.android.sampletvinput W/chromium: [WARNING:resource_bundle.cc(304)] locale_file_path.empty()
10-11 15:11:32.641 27043-27043/com.example.android.sampletvinput I/chromium: [INFO:aw_browser_main_parts.cc(65)] Load from apk succesful, fd=41 off=46184 len=3037
10-11 15:11:32.641 27043-27043/com.example.android.sampletvinput I/chromium: [INFO:aw_browser_main_parts.cc(78)] Loading webviewchromium.pak from, fd:42 off:229484 len:1089587
10-11 15:11:32.705 27043-27043/com.example.android.sampletvinput W/chromium: [WARNING:data_reduction_proxy_settings.cc(331)] SPDY proxy OFF at startup
10-11 15:11:32.716 27043-27043/com.example.android.sampletvinput W/art: Attempt to remove local handle scope entry from IRT, ignoring
10-11 15:11:32.719 27043-27043/com.example.android.sampletvinput W/AwContents: onDetachedFromWindow called when already detached. Ignoring
10-11 15:11:32.720 27043-27043/com.example.android.sampletvinput D/WebView: setupCursorMode - InfraredState:0
10-11 15:11:32.740 27043-27105/com.example.android.sampletvinput D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: false
10-11 15:11:32.746 27043-27043/com.example.android.sampletvinput D/Atlas: Validating map...
10-11 15:11:32.781 27043-27105/com.example.android.sampletvinput I/OpenGLRenderer: Initialized EGL, version 1.4
10-11 15:11:32.784 27043-27105/com.example.android.sampletvinput D/OpenGLRenderer: Enabling debug mode 0
10-11 15:11:32.792 27043-27105/com.example.android.sampletvinput D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000
10-11 15:11:32.919 27043-27112/com.example.android.sampletvinput W/chromium: [WARNING:simple_index_file.cc(337)] Could not map Simple Index file.
10-11 15:11:34.802 27043-27043/com.example.android.sampletvinput I/chromium: [INFO:CONSOLE(0)] "The Content-Security-Policy directive 'base-uri' is implemented behind a flag which is currently disabled.
", source: https://github.com/googlesamples/androidtv-sample-inputs/blob/master/README.md (0)
10-11 15:11:34.802 27043-27043/com.example.android.sampletvinput I/chromium: [INFO:CONSOLE(0)] "Unrecognized Content-Security-Policy directive 'block-all-mixed-content'.
", source: https://github.com/googlesamples/androidtv-sample-inputs/blob/master/README.md (0)
10-11 15:11:34.802 27043-27043/com.example.android.sampletvinput I/chromium: [INFO:CONSOLE(0)] "The Content-Security-Policy directive 'form-action' is implemented behind a flag which is currently disabled.
", source: https://github.com/googlesamples/androidtv-sample-inputs/blob/master/README.md (0)
10-11 15:11:34.803 27043-27043/com.example.android.sampletvinput I/chromium: [INFO:CONSOLE(0)] "Unrecognized Content-Security-Policy directive 'manifest-src'.
", source: https://github.com/googlesamples/androidtv-sample-inputs/blob/master/README.md (0)

PersistableBundle.putBoolean crashes on API 21

When running this project on an old ADT-1 (API version 21), I noticed it crashes when I try to sync the channels. When I look at the EpgSyncJobService class, the two lines (330-331):

persistableBundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
persistableBundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);

have putBoolean highlighted in red and provide the message: "Call requires API 22 (current min is 21): android.os.BaseBundle#putBoolean" (This call seems to available back to API 1 according to the API Reference: https://developer.android.com/reference/android/os/BaseBundle.html#putBoolean(java.lang.String, boolean) )

It seems like I can call those two lines only if the API version is above 21, and I can submit a PR for that. The two settings don't seem to be essential for the task to run.

Stacktrace is below:

01-25 01:37:04.928 15675-15675/com.example.android.sampletvinput E/AndroidRuntime: FATAL EXCEPTION: main
                                                                               Process: com.example.android.sampletvinput, PID: 15675
                                                                               java.lang.IllegalAccessError: Method 'void android.os.BaseBundle.putBoolean(java.lang.String, boolean)' is inaccessible to class 'com.google.android.media.tv.companionlibrary.EpgSyncJobService' (declaration of 'com.google.android.media.tv.companionlibrary.EpgSyncJobService' appears in /data/app/com.example.android.sampletvinput-1/base.apk)
                                                                                   at com.google.android.media.tv.companionlibrary.EpgSyncJobService.requestImmediateSync(EpgSyncJobService.java:330)
                                                                                   at com.google.android.media.tv.companionlibrary.EpgSyncJobService.requestImmediateSync(EpgSyncJobService.java:298)
                                                                                   at com.example.android.sampletvinput.rich.RichSetupFragment.onScanStarted(RichSetupFragment.java:67)
                                                                                   at com.google.android.media.tv.companionlibrary.ChannelSetupFragment.onStart(ChannelSetupFragment.java:187)
                                                                                   at android.app.Fragment.performStart(Fragment.java:2077)
                                                                                   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:922)
                                                                                   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
                                                                                   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1049)
                                                                                   at android.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1874)
                                                                                   at android.app.Activity.performStart(Activity.java:5955)
                                                                                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
                                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
                                                                                   at android.app.ActivityThread.access$800(ActivityThread.java:144)
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                   at android.os.Looper.loop(Looper.java:135)
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5221)
                                                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                                                   at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

App installed fine but on launching it takes me to ReadMe file

Hi there
I am trying to make this work with android device sdk 19, (not TV), the app installed fine but funny I am getting the Read Me file on this source on launching the app.
I thought I will get the video to play from the file RichTvInputService.
How do I get the sample channels to show and play, and finally which file contain the links for mp4 or m3u8?
Many thanks.

java.lang.IllegalArgumentException: Unknown URL content://android.media.tv/channel

Hi,

I am compiled the code and trying to run the application on my phone and virtual avd device.
I get the following exception:

02-19 18:05:49.280 22014-22014/com.example.karunakar.tif I/art﹕ Late-enabling -Xcheck:jni
02-19 18:05:49.663 22014-22044/com.example.karunakar.tif D/OpenGLRenderer﹕ Render dirty regions requested: true
02-19 18:05:49.687 22014-22014/com.example.karunakar.tif D/Atlas﹕ Validating map...
02-19 18:05:49.772 22014-22044/com.example.karunakar.tif I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1.04.04.02.162.107_msm8226_LA.BF.1.1__release_AU ()
OpenGL ES Shader Compiler Version: E031.25.01.03
Build Date: 10/28/14 Tue
Local Branch:
Remote Branch: quic/l_LNX.LA.3.6
Local Patches: NONE
Reconstruct Branch: AU_LINUX_ANDROID_LA.BF.1.1.04.04.02.162.107 + cb93e16 + f50fe49 + d7c18e6 + 5b9a565 + 0f3a25d + 607156e + 75511aa + e4d16c0 + 686f3eb + 211a271 + dd281ee + NOTHING
02-19 18:05:49.781 22014-22044/com.example.karunakar.tif I/OpenGLRenderer﹕ Initialized EGL, version 1.4
02-19 18:05:49.815 22014-22044/com.example.karunakar.tif D/OpenGLRenderer﹕ Enabling debug mode 0
02-19 18:05:51.301 22014-22014/com.example.karunakar.tif E/ActivityThread﹕ Failed to find provider info for android.media.tv
02-19 18:05:51.302 22014-22014/com.example.karunakar.tif E/ActivityThread﹕ Failed to find provider info for android.media.tv
02-19 18:05:51.302 22014-22014/com.example.karunakar.tif D/AndroidRuntime﹕ Shutting down VM
02-19 18:05:51.306 22014-22014/com.example.karunakar.tif E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.karunakar.tif, PID: 22014
java.lang.IllegalArgumentException: Unknown URL content://android.media.tv/channel
at android.content.ContentResolver.insert(ContentResolver.java:1203)
at com.example.android.sampletvinput.simple.SimpleTvInputSetupActivity.registerChannels(SimpleTvInputSetupActivity.java:84)
at com.example.android.sampletvinput.simple.SimpleTvInputSetupActivity.access$000(SimpleTvInputSetupActivity.java:36)
at com.example.android.sampletvinput.simple.SimpleTvInputSetupActivity$MyAlertDialogFragment$2.onClick(SimpleTvInputSetupActivity.java:104)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:160)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5312)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)

Kindly please help.

Thanks,
KM

TvPlayer.Callback.onError should have an error parameter

I can register a callback in my TvInputService for when there is an exception to my player, although there is no way to identify the type of error. I suggest adding an Exception error parameter to the onError method to identify the type of exception and handle it accordingly.

Philips QM163XE does not add any channel

I cloned the current version and ran it in Android Studio, deployed it to my Philips 7101 QM163XE Android TV running Marshmallow 6.0.1 with the Live channels app (installed from Google Play Store).
When selecting the source called "Rich Input", I see on the right side that channels are added. After the screen returns I get a toast which is called in German "Keine Kanäle hinzugefügt" which should be "No channels added" and it still says "No channels available".
The same happens with my own app using TIF. I tried it on Nexus Player, Shield, MIBOX and it worked fine.
But there are other apps on Philips TV running fine like Zattoo, Haystack, Bloomberg, Google Movies...
I attached the adb log, no errors there. I also added the bugreport file. Thanks in advance.

log.txt

Live Channels with no audio (onSetStreamVolume gets volume = 0)

My TvInputService.Session implementation is working fine, in the sense that the channels provided by my app are listed and play well in the Live Channels app.

However, the public void onSetStreamVolume(float volume) method callback gets called with volume=0.

In the sample project you provided, the onSetStreamVolume seems to get call with 0 while buffering the video but then with value 1.

For my implementation while buffering the volume is set to 0, but the method doesn't get call with value 1.

Do you have an idea about why is the onSetStreamVolume getting called with 0 instead of 1 once the video is ready to play?

I understand we don't have control over this method.

How to add custom categories to group the channels in program guide?

I've seen the programs have genre feature and its limited to some genres from TvContract.Programs.Genres . But is there any way that I can group channels without program data by categories like usa, uk etc.

I have some channels that don't have program data. I want to show them on the tif program guide and group them by my custom categories.

Please some help me how could I achieved this.

Thanks

App just stops after first dialog (Nexus Player)

I tried starting the app on a Nexus Player. The only thing I get to see is a dialog with the text

"Setup Simple Input. Do you want to register detected channels?"

And then, whether I click "OK" or "Cancel" the app just stops.

Here is the logcat output as captured with pidcat.py:

Process com.example.android.sampletvinput created for activity com.example.android.sampletvinput/.simple.SimpleTvInputSetupActivity
                        PID: 16685   UID:    GIDs: 

                art  E  Failed writing handshake bytes (-1 of 14): Broken pipe
                     I  Debugger is no longer active
     OpenGLRenderer  D  Use EGL_SWAP_BEHAVIOR_PRESERVED: true
             linker  W  gralloc.moorefield.so: unused DT entry: type 0x1d arg 0x8d2
              Atlas  D  Validating map...
     OpenGLRenderer  I  Initialized EGL, version 1.4
                     W  Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
             linker  W  libpvrcpt.so: unused DT entry: type 0x1d arg 0xe97
     OpenGLRenderer  D  Enabling debug mode 0

                        Process com.example.android.sampletvinput (PID: 16685) ended

Passthru HDMI streaming in custom Tv-Input-App

Greetings,

I don't know if this is right place to ask,

but I want to know if at all possible and how to go about accessing the local HDMI input on my personal AndroidTV and streaming it thru my Tv-Input-app.

I am aware that the scenario mentioned above is probably not possible as a third party app being installed on someone else androitdTv; but is it possible is I sideload the app into my personal Android TV ?

I'm trying to run this app on a this set top box device and I get null pointer exception when I try to search for channels

The device has Android 5.0 and it's attached to a DVB-T antenna and to a screen via HDMI.

The trace is always something like this:

com.example.android.sampletvinput E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.android.sampletvinput, PID: 4006
    java.lang.IllegalArgumentException: the bind value at index 1 is null
            at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
            at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
            at android.content.ContentProviderProxy.insert(ContentProviderNative.java:475)
            at android.content.ContentResolver.insert(ContentResolver.java:1207)
            at com.example.android.sampletvinput.TvContractUtils.updateChannels(TvContractUtils.java:109)
            at com.example.android.sampletvinput.rich.RichSetupFragment.setupChannels(RichSetupFragment.java:211)
            at com.example.android.sampletvinput.rich.RichSetupFragment.access$800(RichSetupFragment.java:61)
            at com.example.android.sampletvinput.rich.RichSetupFragment$SetupRowTask$1.onActionClicked(RichSetupFragment.java:174)
            at android.support.v17.leanback.widget.DetailsOverviewRowPresenter$ViewHolder$3$1.onClick(DetailsOverviewRowPresenter.java:154)
            at android.view.View.performClick(View.java:4756)
            at android.view.View.onKeyUp(View.java:8935)
            at android.widget.TextView.onKeyUp(TextView.java:5937)
            at android.view.KeyEvent.dispatch(KeyEvent.java:2633)
            at android.view.View.dispatchKeyEvent(View.java:8338)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
            at android.support.v17.leanback.widget.BaseGridView.dispatchKeyEvent(BaseGridView.java:617)
            at android.support.v17.leanback.widget.HorizontalGridView.dispatchKeyEvent(HorizontalGridView.java:37)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
            at android.support.v17.leanback.widget.BaseGridView.dispatchKeyEvent(BaseGridView.java:617)
            at android.support.v17.leanback.widget.VerticalGridView.dispatchKeyEvent(VerticalGridView.java:27)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
            at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1600)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2306)
            at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1682)
            at android.app.Activity.dispatchKeyEvent(Activity.java:2699)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2221)
            at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3918)
            at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3880)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
            at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3578)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476)
            at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3635)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
            at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3578)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476)
            at android.view.Vie

The cause is probably that this line in onCreate returns null:

mInputId = getIntent().getStringExtra(TvInputInfo.EXTRA_INPUT_ID);

Why, what, how? Any help would be appreciated.

TV Input Framework available until API 25 only?

On this page: https://developer.android.com/training/tv/tif/ there is a clear statement that Tv Input Framework is available until API 25 only. If so, then what are the recommendations for handling TV inputs on later APIs and why aren't Tv Input Framework's APIs marked as deprecated on later APIs (checked on Oreo and Pie) ?

Also, do you plan to support this repository? It seems abandoned and unmaintained so maybe it should be clearly marked as such.

Overlay not showing on API 28

After calling setOverlayViewEnabled(true), overriding onCreateOverlay and returning a view, the overlay is correctly showing up on Android 8.1 but not on Android 9.

Any idea why is this?

Release TV Input Framework Companion Library as library

The TV Input Framework Companion Library mentioned at http://android-developers.blogspot.dk/2016/11/adding-tv-channels-to-your-app-with-the-tif-companion-library.html and available at https://github.com/googlesamples/androidtv-sample-inputs/tree/master/library is currently usable by copying the code to other projects.

Wouldn't it be nicer if the The TV Input Framework Companion Library was actually released as a library such that it could simply be included as a dependency?

Playback restarts when EPG is updated

When you are watching a program and EPG is updated, then playback restarts. The experience is a bit annoying because the stream may revert to lower quality and buffer until it switches back to the (higher) quality before the restart. Also, it may happen that you get to rewatch a couple of seconds.

A workaround is to ensure that EPG updates occur less frequently but that may conflict with always having the latest EPG information.

I have not had time to investigate further (I just discovered the restarts when watching and noticed that they match with the EPG update timing) but at least now it's tracked as an issue here.

This has (so far) been tested with com.google.android.media.tv:companionlibrary:1.0.1.

how to compile it on android studio 3.1.4

Hi guys

i am having alot of erros trying to compile this on the new android studio 3.1.4 with myssing files , and sync projects..

can anyone confirm this can be compiled on new android studio 3.1.4 with sdk 27

TV Input Framework Companion Library depends on support libraries 24.0.0

The latest version of TV Input Framework Companion Library (0.2) depends specifically on support libraries from SDK 24 (as seen when ./gradlew -q dependencies app:dependencies --configuration compile is run):
+--- com.google.android.libraries.tv:companionlibrary:0.2
| +--- com.android.support:appcompat-v7:24.0.0
| | +--- com.android.support:support-vector-drawable:24.0.0
| | \--- com.android.support:animated-vector-drawable:24.0.0
| | \--- com.android.support:support-vector-drawable:24.0.0

However, SDK 26 is already available, and using it alongside Companion Library 0.2 causes warnings in gradle about mixing versions. We haven't experienced any issues as of yet, but, as the warning rightly suggests, mixing versions can lead to runtime crashes.

My question is: will a new version of Companion Library supporting SDK 26 be released? And if so, when can such a release be expected?

Additionally, I noticed that README.md on https://github.com/googlesamples/androidtv-sample-inputs is outdated - it still suggests using version 0.1 in the "TIF Companion Library" section.

Anyone use this and got it working ? There seems to be a problem with this Repository.

Anyone use this and got it working ? There seems to be a problem with this Repository.

Also @integer/google_play_services_version file is missing

Originally posted by @ralphgabrielle in #25 (comment)

For Update :

This may help :

packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/dependencies.txt'
exclude 'META-INF/LGPL2.1'
exclude 'META-INF/rxjava.properties'

    exclude 'error_prone/Annotations.gwt.xml'

    exclude 'third_party/java_src/error_prone/project/annotations/Annotations.gwt.xml'
    exclude 'third_party/java_src/error_prone/project/annotations/Google_internal.gwt.xml'
    exclude 'third_party/java_src/error_prone/project/annotations/Google_internal.gwt.xml'
    exclude 'jsr305_annotations/Jsr305_annotations.gwt.xml'
}

not working on sony bravia

after installing the apk on my new bravia tv (android 6),
in the live channel app i get a message "No channels added"?

while i can see my channel on the streaming channels

any idea?

Sample crashes on N preview emulator

The sample works well on M, but on N, when I enter the TV app, I get this exception:

05-29 20:24:18.523 2569-2569/com.android.tv E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.android.tv, PID: 2569
java.lang.IllegalStateException: Layout state should be one of 100 but it is 10
at android.support.v7.widget.RecyclerView$State.assertLayoutStep(RecyclerView.java:10453)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep3(RecyclerView.java:3256)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3059)
at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1469)
at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1533)
at android.support.v7.widget.RecyclerView.scrollBy(RecyclerView.java:1454)
at com.android.tv.guide.TimelineRow.scrollTo(TimelineRow.java:59)
at com.android.tv.guide.TimelineRow.onRtlPropertiesChanged(TimelineRow.java:67)
at android.view.View.resolvePadding(View.java:15192)
at android.view.ViewGroup.resolvePadding(ViewGroup.java:6607)
at android.view.View.getPaddingLeft(View.java:18752)
at android.support.v7.widget.RecyclerView$LayoutManager.getPaddingLeft(RecyclerView.java:7425)
at android.support.v7.widget.OrientationHelper$1.getStartAfterPadding(OrientationHelper.java:269)
at android.support.v7.widget.LinearLayoutManager$AnchorInfo.assignCoordinateFromPadding(LinearLayoutManager.java:2194)
at android.support.v7.widget.LinearLayoutManager.updateAnchorInfoForLayout(LinearLayoutManager.java:734)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:486)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3239)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3048)
at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1469)
at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1533)
at android.support.v7.widget.RecyclerView.scrollBy(RecyclerView.java:1454)
at com.android.tv.guide.TimelineRow.scrollTo(TimelineRow.java:59)
at com.android.tv.guide.TimelineRow.onRtlPropertiesChanged(TimelineRow.java:67)
at android.view.View.resolvePadding(View.java:15192)
at android.view.ViewGroup.resolvePadding(ViewGroup.java:6607)
at android.view.ViewGroup.resolvePadding(ViewGroup.java:6612)
at android.view.ViewGroup.resolvePadding(ViewGroup.java:6612)
at android.view.ViewGroup.resolvePadding(ViewGroup.java:6612)
at android.view.View.resolveRtlPropertiesIfNeeded(View.java:14943)
at android.view.ViewGroup.resolveRtlPropertiesIfNeeded(ViewGroup.java:6534)
at android.view.View.setLayoutDirection(View.java:8177)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1507)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1240)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6298)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
at android.view.Choreographer.doCallbacks(Choreographer.java:670)
at android.view.Choreographer.doFrame(Choreographer.java:606)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:5969)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:801)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:691)

SQLiteFullException: database or disk is full (code 13)

Hi,
This sample is working fine on emulator but when I am installing apk on TV(Real device), Then i am getting this error,

10-22 19:17:03.687 2538 4411 E AndroidRuntime: FATAL EXCEPTION: IntentService[EpgDataCleanupService]
10-22 19:17:03.687 2538 4411 E AndroidRuntime: Process: com.android.providers.tv, PID: 2538
10-22 19:17:03.687 2538 4411 E AndroidRuntime: android.database.sqlite.SQLiteFullException: database or disk is full (code 13)
10-22 19:17:03.687 2538 4411 E AndroidRuntime: at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)
10-22 19:17:03.687 2538 4411 E AndroidRuntime: at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:734)
10-22 19:17:03.687 2538 4411 E AndroidRuntime: at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)
10-22 19:17:03.687 2538 4411 E AndroidRuntime: at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
10-22 19:17:03.687 2538 4411 E AndroidRuntime: at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1502)
10-22 19:17:03.687 2538 4411 E AndroidRuntime: at com.android.providers.tv.TvProvider.delete(TvProvider.java:902)
10-22 19:17:03.687 2538 4411 E AndroidRuntime: at android.content.ContentProvider$Transport.delete(ContentProvider.java:340)
10-22 19:17:03.687 2538 4411 E AndroidRuntime: at android.content.ContentResolver.delete(ContentResolver.java:1371)
10-22 19:17:03.687 2538 4411 E AndroidRuntime: at com.android.providers.tv.EpgDataCleanupService.clearOldPrograms(EpgDataCleanupService.java:80)
10-22 19:17:03.687 2538 4411 E AndroidRuntime: at com.android.providers.tv.EpgDataCleanupService.onHandleIntent(EpgDataCleanupService.java:59)
10-22 19:17:03.687 2538 4411 E AndroidRuntime: at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:68)
10-22 19:17:03.687 2538 4411 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
10-22 19:17:03.687 2538 4411 E AndroidRuntime: at android.os.Looper.loop(Looper.java:154)
10-22 19:17:03.687 2538 4411 E AndroidRuntime: at android.os.HandlerThread.run(HandlerThread.java:61)

android.view.WindowManager$BadTokenException while creating OverlayView

This sample recommends to enable overlay view right when session is created:

    @Override
    public final Session onCreateSession(String inputId) {
        RichTvInputSessionImpl session = new RichTvInputSessionImpl(this, inputId);
        session.setOverlayViewEnabled(true);
        return super.sessionCreated(session);
    }

But when I follow it I'm getting rare crashes due TV Player's activity isn't ready:

Critical error: android.view.WindowManager$BadTokenException
Unable to add window -- token android.os.BinderProxy@998cc80 is not valid; is your activity running?
arrow_right

android.view.ViewRootImpl.setView (ViewRootImpl.java:571)
android.view.WindowManagerGlobal.addView (WindowManagerGlobal.java:310)
android.view.WindowManagerImpl.addView (WindowManagerImpl.java:85)
android.media.tv.TvInputService$Session.createOverlayView (TvInputService.java:1217)
android.media.tv.ITvInputSessionWrapper.executeMessage (ITvInputSessionWrapper.java:147)
com.android.internal.os.HandlerCaller$MyHandler.handleMessage (HandlerCaller.java:37)
android.os.Handler.dispatchMessage (Handler.java:102)
android.os.Looper.loop (Looper.java:148)
android.app.ActivityThread.main (ActivityThread.java:5422)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:726)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616)

It looks like some race condition, cause setOverlayViewEnabled posts runnable with createOverlayView but there is no guarantee that TV activity is live at that moment,

It happens on all main android TV devices: MiBox, Sony TV, Nexus Player

I've created issue in Android's bug tracking long time ago: https://issuetracker.google.com/issues/37131314

Not a channel: null on Philips TVs

I'm getting a crash on EpgSyncJobService:

Caused by java.lang.IllegalArgumentException
Not a channel: null
android.media.tv.TvContract.buildChannelLogoUri (TvContract.java:507)
com.google.android.media.tv.companionlibrary.model.ModelUtils.updateChannels (ModelUtils.java:124)
com.google.android.media.tv.companionlibrary.sync.EpgSyncJobService$EpgSyncTask.doInBackground (EpgSyncJobService.java:412)
com.google.android.media.tv.companionlibrary.sync.EpgSyncJobService$EpgSyncTask.doInBackground (EpgSyncJobService.java:383)
android.os.AsyncTask$2.call (AsyncTask.java:333)
java.util.concurrent.FutureTask.run (FutureTask.java:266)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1162)
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:636)
java.lang.Thread.run (Thread.java:764)

This crash only happens on 2 Philips devices:
4K LED TV powered by Android (Android 8)
Philips Android TV (Android 9)

Probably some TIF implementation issues on Philips devices. Anyone know a workaround?

Playback Controls Missing

When I run this app. on an Android N emulator, I can channel change, but I cannot pause, rewind, or fast-forward any video. I can navigate the menu using the d-pad, but nothing happens when any of the playback control buttons are pressed.

From https://source.android.com/devices/tv/, "For TV Inputs that support time shifting, the TV App needs to display playback controls". Do the sample inputs support time shifting?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.