【问题标题】:Right way to use YouTube.Builder使用 YouTube.Builder 的正确方法
【发布时间】:2016-08-03 14:20:05
【问题描述】:

我需要获取用户 youtube 视频。这是我的代码,它只尝试获取用户 youtube 频道。但它不起作用 - 选择帐户后,loadYoutubeChannels 总是出错。我读了这个answer 和这个yt-direct-lite-android,但仍然不明白为什么他们没有收到错误,但我明白了。
这是我的代码:

class YotubeTestActivity extends AppCompatActivity {

  private var credential: GoogleAccountCredential = _
  private var service: YouTube = _

  override def onCreate(savedInstanceState: Bundle): Unit = {
    super.onCreate(savedInstanceState)

    val prefs = getPreferences(Context.MODE_PRIVATE)
    credential = GoogleAccountCredential.usingOAuth2(this, List(YouTubeScopes.YOUTUBE_READONLY))
    credential.setSelectedAccountName(prefs.getString(PrefAccountName, None.orNull))

    val transport = new NetHttpTransport()
    val factory =  new JacksonFactory()

    service = new YouTube.Builder(transport, factory, credential)
      .setApplicationName(getString(R.string.app_name))
      .setYouTubeRequestInitializer(new YouTubeRequestInitializer(ApiKey)) // <-- (1)
      .build()
  }

  /*
  check for Google Play Service

  choose account
   */

  private def onAccountChooseOk(accountName: String): Unit = {
    credential.setSelectedAccountName(accountName)

    val prefs = getPreferences(Context.MODE_PRIVATE).edit()
    prefs.putString(PrefAccountName, accountName)
    prefs.commit()

    rxScalaRunInBackground(loadYoutubeChannels, onLoadYoutubeChannelsOk, onLoadYoutubeChannelsError)
  }

  private def loadYoutubeChannels(): ChannelListResponse = {
    val channelsQuery = service.channels().list("contentDetails")
    channelsQuery.setMine(true)
    channelsQuery.setMaxResults(50l)
    //channelsQuery.setKey(ApiKey)  // <-- (2)
    channelsQuery.execute()
  }

  private def onLoadYoutubeChannelsError(e: Throwable): Unit = {
    Log.e(Tag, "onLoadYoutubeChannelsError", e)

    e match {
      case _: GooglePlayServicesAvailabilityIOException => // checkGooglePlayServicesAvailable()
      case e: UserRecoverableAuthIOException => // startActivityForResult(e.getIntent, RequestAuthorization);
      case _ => finish()
    }
  }

  private def onLoadYoutubeChannelsOk(response: ChannelListResponse): Unit = {
    Log.e(Tag, s"onLoadYoutubeChannelsOk: $response")
  }

}

object YotubeTestActivity {

  private val Tag = "YotubeTestActivity"    
  private val PrefAccountName = "accountName"    
  private val ApiKey = "API_KAY_FROM_DEV_CONSOLE"

}

当我不使用 ApiKey 时,我的意思是当 (1)(2) 被评论时,我得到这个错误:

{
  "code" : 403,
  "errors" : [ {
    "domain" : "usageLimits",
    "message" : "Access Not Configured. YouTube Data API has not been used in project 608941808256 bef$re or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/youtube/overview?project=608941808256 then r$try. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.",
    "reason" : "accessNotConfigured",
    "extendedHelp" : "https://console.developers.google.com/apis/api/youtube/overview?project=60894180$256"
  } ],
  "message" : "Access Not Configured. YouTube Data API has not been used in project 608941808256 befor$ or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/youtube/overview?project=608941808256 then ret$y. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry."
}

当我使用 浏览器密钥api key 时,我收到此错误:

{
  "code" : 401,
  "errors" : [ {
    "domain" : "global",
    "location" : "Authorization",
    "locationType" : "header",
    "message" : "Invalid Credentials",
    "reason" : "authError"
  } ],
  "message" : "Invalid Credentials"
}

据我了解 yt-direct-lite-android 仅在 YouTubePlayerFragment 中使用 ApiKey,但在获取一些 youtube 数据时不使用(渠道等)。所以..这是不公平的。

有人能告诉我我做错了什么吗?谢谢。

【问题讨论】:

    标签: android scala youtube-api


    【解决方案1】:

    这是我的解决方案:

    打开google developers console
    转到凭据/OAuth 同意屏幕。填写向用户显示的产品名称。也放在这里:

    service = new YouTube.Builder(transport, factory, credential)
      .setApplicationName(/*Product name shown to users*/)
    

    下一步 - 注册您的应用。转到 Credentials/credentials 并单击按钮 Create credentials 然后选择 OAuth Client ID 然后选择 Android 并将您的在那里应用 SHA1。

    最后一步 - 创建 api 密钥。在 Credentials/credentials 点击按钮 Create credentials 并选择 API key 然后选择 Browser key。然后在这里使用这个生成的浏览器密钥。

    private val ApiKey = "/*Browser key*/"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-17
      • 2012-02-23
      • 2013-01-09
      • 2010-12-28
      • 2012-04-26
      • 2014-10-24
      • 2013-07-29
      • 2013-06-14
      相关资源
      最近更新 更多