El botón Cast no aparece

Estoy intentando crear una aplicación de remitente de ChomeCast con Android Studio. He implementado todo el código necesario para poder agregar el botón Cast, pero no está disponible

Aquí está mi código.

Construir un gradiente

apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3" defaultConfig { minSdkVersion 10 targetSdkVersion 19 versionCode 1 versionName "1.0" } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } buildTypes { release { runProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:19.+' compile 'com.google.android.gms:play-services:4.3.+' compile 'com.android.support:mediarouter-v7:19.+' } 

Res / menu / main.xml

  <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.castbuttontest.app.MainActivity" > <item android:id="@+id/media_route_menu_item" android:title="@string/media_route_menu_title" app:actionProviderClass="android.support.v7.app.MediaRouteActionProvider" app:showAsAction="always"/> </menu> 

MainActivity.java

  package com.example.castbuttontest.app; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.support.v7.app.MediaRouteActionProvider; import android.support.v7.media.MediaRouteSelector; import android.support.v7.media.MediaRouter; import android.view.Menu; import android.view.MenuItem; import com.google.android.gms.cast.Cast; import com.google.android.gms.cast.CastDevice; import com.google.android.gms.cast.CastMediaControlIntent; import com.google.android.gms.common.api.GoogleApiClient; public class MainActivity extends ActionBarActivity { MediaRouter mediaRouter; MediaRouteSelector mediaRouteSelector; MediaRouter.Callback myMediaRouterCallBack = new MediaRouter.Callback() { @Override public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) { CastDevice device = CastDevice.getFromBundle(route.getExtras()); } @Override public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route) { } }; @Override protected void onCreate(Bundle savedInstanceState) { String APP_ID = "F6D3E50B"; super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mediaRouter = MediaRouter.getInstance(this); mediaRouteSelector = new MediaRouteSelector.Builder() //.addControlCategory(CastMediaControlIntent.categoryForCast(APP_ID)) .addControlCategory(CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID) .build(); } @Override protected void onStart() { super.onStart(); mediaRouter.addCallback(mediaRouteSelector, myMediaRouterCallBack,MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN); } @Override protected void onStop() { mediaRouter.removeCallback(myMediaRouterCallBack); super.onStop(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); MenuItem mediaRouterItem = menu.findItem(R.id.media_route_menu_item); MediaRouteActionProvider provider = (MediaRouteActionProvider) MenuItemCompat.getActionProvider(mediaRouterItem); provider.setRouteSelector(mediaRouteSelector); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); return super.onOptionsItemSelected(item); } } 

¿Puedes decir dónde se encuentra el problema? Gracias por adelantado

EDIT: Finalmente he resuelto el problema. He creado un nuevo proyecto vacío y reescrito el código siguiendo el tutorial de la aplicación Sender ( enlace ):

MainActivity.java

  /* Copyright 2014 Charles-Eugene LOUBAO Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package cf.charly1811.android.sample.MediaRouteProvider; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.support.v7.app.MediaRouteActionProvider; import android.support.v7.media.MediaRouteSelector; import android.support.v7.media.MediaRouter; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import com.google.android.gms.cast.CastDevice; import com.google.android.gms.cast.CastMediaControlIntent; public class MainActivity extends ActionBarActivity { /** * This sample shows how to add the Cast Button to the action bar using MediaRouterProvider * @see "https://developers.google.com/cast/docs/android_sender" */ public static final String TAG = MainActivity.class.getSimpleName(); String APP_ID = "F6D3E50B"; MediaRouter mediaRouter; MediaRouteSelector mediaRouteSelector; MediaRouter.Callback mMediaRouterCallback; CastDevice mCastDevice; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mediaRouter = MediaRouter.getInstance(this); mediaRouteSelector = new MediaRouteSelector.Builder() .addControlCategory(CastMediaControlIntent.categoryForCast(APP_ID)) .build(); mMediaRouterCallback = new MediaRouter.Callback() { @Override public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) { super.onRouteSelected(router, route); Log.d(TAG, "Connected to "+ route.getName()); mCastDevice = CastDevice.getFromBundle(route.getExtras()); Toast.makeText(getApplicationContext(), "Connected to "+route.getName(),Toast.LENGTH_LONG).show(); } @Override public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route) { super.onRouteUnselected(router, route); mCastDevice = null; } }; } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume"); mediaRouter.addCallback(mediaRouteSelector,mMediaRouterCallback,MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause"); if(isFinishing()) { mediaRouter.removeCallback(mMediaRouterCallback); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); MenuItem media_route_menu_item = menu.findItem(R.id.media_route_menu_item); MediaRouteActionProvider provider = (MediaRouteActionProvider) MenuItemCompat.getActionProvider(media_route_menu_item); provider.setRouteSelector(mediaRouteSelector); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. /* int id = item.getItemId(); if (id == R.id.action_settings) { return true; } */ return super.onOptionsItemSelected(item); } } 

Y ahora funciona correctamente. El icono ya está disponible y puedo conectarme a mi Chromecast. No estoy seguro, pero creo que el problema fue sobre la instancia de MediaRouter.Callback;

PS: He subido el código completo en GitHub. Puedes comprobarlo. ( Enlace )

Reescribirlo todo desde el principio no muestra realmente a nadie donde el problema era …

Tienes

.addControlCategory(CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID)

en lugar de

.addControlCategory(CastMediaControlIntent.categoryForCast(CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID))

Estaba pasando APP_ID directamente a la categoría. Supongo que la categoría tiene un formato especial y APP_ID no es exactamente eso. Hice el mismo error. 🙂

Finalmente he resuelto el problema. He creado un nuevo proyecto vacío y reescrito el código siguiendo el tutorial de la aplicación Sender ( enlace ):

MainActivity.java

  /* Copyright 2014 Charles-Eugene LOUBAO Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package cf.charly1811.android.sample.MediaRouteProvider; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.support.v7.app.MediaRouteActionProvider; import android.support.v7.media.MediaRouteSelector; import android.support.v7.media.MediaRouter; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import com.google.android.gms.cast.CastDevice; import com.google.android.gms.cast.CastMediaControlIntent; public class MainActivity extends ActionBarActivity { /** * This sample shows how to add the Cast Button to the action bar using MediaRouterProvider * @see "https://developers.google.com/cast/docs/android_sender" */ public static final String TAG = MainActivity.class.getSimpleName(); String APP_ID = "F6D3E50B"; MediaRouter mediaRouter; MediaRouteSelector mediaRouteSelector; MediaRouter.Callback mMediaRouterCallback; CastDevice mCastDevice; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mediaRouter = MediaRouter.getInstance(this); mediaRouteSelector = new MediaRouteSelector.Builder() .addControlCategory(CastMediaControlIntent.categoryForCast(APP_ID)) .build(); mMediaRouterCallback = new MediaRouter.Callback() { @Override public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) { super.onRouteSelected(router, route); Log.d(TAG, "Connected to "+ route.getName()); mCastDevice = CastDevice.getFromBundle(route.getExtras()); Toast.makeText(getApplicationContext(), "Connected to "+route.getName(),Toast.LENGTH_LONG).show(); } @Override public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route) { super.onRouteUnselected(router, route); mCastDevice = null; } }; } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume"); mediaRouter.addCallback(mediaRouteSelector,mMediaRouterCallback,MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause"); if(isFinishing()) { mediaRouter.removeCallback(mMediaRouterCallback); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); MenuItem media_route_menu_item = menu.findItem(R.id.media_route_menu_item); MediaRouteActionProvider provider = (MediaRouteActionProvider) MenuItemCompat.getActionProvider(media_route_menu_item); provider.setRouteSelector(mediaRouteSelector); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. /* int id = item.getItemId(); if (id == R.id.action_settings) { return true; } */ return super.onOptionsItemSelected(item); } } 

Y ahora funciona correctamente. El icono ya está disponible y puedo conectarme a mi Chromecast. No estoy seguro, pero creo que el problema fue sobre la instancia de MediaRouter.Callback;

PS: He subido el código completo en GitHub. Puedes comprobarlo. ( Enlace )

  • No se pueden cargar archivos de sonido LibGdx
  • Samsung Galaxy 7 "(GT-P6210) no detecta la depuración USB?
  • Android getListView () en error de fragmento
  • Android: EfficientAdapter con dos vistas diferentes
  • Cómo utilizar Google Api de traducción en mi aplicación de Android
  • Android: ¿Cómo iniciar la actividad desde el menú de preferencias?
  • Necesito una consulta SQL para encontrar todas las palabras que puede hacer con un conjunto de letras, incluyendo hasta dos fichas en blanco
  • Error de ejecución para la tarea ': app: transformClassesWithJarMergingForDebug
  • EXCEPCIÓN FATAL: ZoomTableManager
  • Consulta de SQLiteDatabase de Android con Regex
  • Java.lang.IllegalStateException: no se pudo obtener la superficie
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.