【发布时间】:2014-06-23 17:17:20
【问题描述】:
我正在尝试使用 Android Studio 创建 ChomeCast 发件人应用。我已经实现了所有需要能够添加投射按钮的代码,但它不可用
这是我的代码。
build.gradle
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);
}
}
你能说出问题出在哪里吗? 提前致谢
编辑: 我终于解决了这个问题。我创建了一个新的 Empty 项目并按照 Sender App 教程 (Link) 重写了代码:
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);
}
}
现在它可以正常工作了。该图标现在可用,我可以连接到我的 Chromecast。我不确定,但我认为问题出在 MediaRouter.Callback 的实例上;
PS:我已经在 GitHub 上上传了完整的代码。你可以检查一下。 (Link)
【问题讨论】:
-
尝试使用
android:前缀复制app:属性,这样您将同时拥有app:showAsAction和android:showAsAction,以及app:actionProviderClass和android:actionProviderClass。 -
menu.xml是正确的menuxml 名称吗?但是你的代码引用了R.menu.main,这意味着你在res/menu下还有另一个main.xml -
@CommonsWare 相同的结果。 Libin 创建问题时出现错误,我已将 menu.xml 更改为 menu/main.xml
-
好的。看我的回答。如果您发现任何问题,请告诉我
-
您确定您确实有 Chromecast 可以连接吗?如果没有可用的匹配路由,则不会显示操作提供程序。 FWIW,this sample project 显示设置
MediaRouteActionProvider,但不使用 Cast SDK 特定的类别。
标签: java android chromecast