Use GraceNote SDK in iOS(二)获取音乐的完整信息
在需求彻底明朗化,外加从MusicFans转到GraceNote,再从GraceNote的GNSDK转到iOS SDK后,最终完毕了在iOS上通过音乐的部分信息获取完整信息的功能了。(好吧,我承认是相对完整。。。)
首先介绍下在项目中配置GraceNote的iOS SDK。
SDK的下载地址:Mobile Client
注意要先登录才干见到文件的下载链接。另外官网还给出来一个SDK的配置文档,全然跟着走在Xcode 5是走不通的,只是也具有一定的指导作用,建议看一看。
下载解压后,新建一个project,加入GracenoteMusicID.framework到project中:
新建一个头文件GraceNote.h,导入该框架中的头文件(在本project中已经导入所有须要使用到的头文件了):
#ifndef MFDemo_iOS_GraceNote_h
#define MFDemo_iOS_GraceNote_h #import <GracenoteMusicID/GNConfig.h>
#import <GracenoteMusicID/GNOperations.h>
#import <GracenoteMusicID/GNSearchResultReady.h>
#import <GracenoteMusicID/GNSearchResponse.h>
#import <GracenoteMusicID/GNSearchResult.h>
#import <GracenoteMusicID/GNImage.h>
#import <GracenoteMusicID/GNCoverArt.h>
#import <GracenoteMusicID/GNDescriptor.h> #endif
然后配置project环境,依次在Build Phases中增加下列系统库文件:
配置完毕。
事实上这个SDK的使用很的简单。
第一步,通过你的GraceNote帐号配置GNConfig类(我直接放在了AppDelegate中,这样能够配置能够全局使用):
#import <UIKit/UIKit.h>
#import <GracenoteMusicID/GNConfig.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (retain, nonatomic) GNConfig *app_gnConfig; @end
#import "AppDelegate.h" static NSString * kClientID = @"4541440-79EFBF4E21724D084BA87FF9B242F0C9";
static NSString * kCoverArtProperty = @"content.coverArt";
static NSString * kCoverArtSizeProperty = @"content.coverArt.sizePreference";
static NSString * kYESBooleanString = @"1";
static NSString * kCoverArtSizeLarge = @"LARGE";
static NSString * kCoverArtSizeThumbnail = @"THUMBNAIL";
static NSString * kCoverArtSizeSmall = @"SMALL"; @implementation AppDelegate
@synthesize app_gnConfig = _app_gnConfig; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.app_gnConfig = [GNConfig init:kClientID]; // <Client ID>-<Client ID Tag>
[_app_gnConfig setProperty:kCoverArtProperty value:kYESBooleanString];
[_app_gnConfig setProperty:kCoverArtSizeProperty value:kCoverArtSizeThumbnail]; return YES;
}
client id就是申请应用时的ID,不清楚的能够參考Use GraceNote SDK in iOS(一)通过序列化的GDO查询专辑封面。然后设置content.coverArt属性打开,否则返回的数据中将不会有专辑封面。
第二步,通过以下的方法发起查询请求:
+ (void) searchByText:(id<GNSearchResultReady>)resultReady
config:(GNConfig*)config
artist:(NSString*)artist
albumTitle:(NSString*)albumTitle
trackTitle:(NSString*)trackTitle;
在Demo中,就是一个Button中的方法:
- (IBAction)check:(id)sender {
[_checking_activityIndicator startAnimating];
self.view.alpha = 0.75;
self.view.userInteractionEnabled = NO;
[GNOperations searchByText:self
config:((AppDelegate *)[[UIApplication sharedApplication] delegate]).app_gnConfig
artist:_artist_textField.text
albumTitle:_album_textField.text
trackTitle:_trackTitle_textField.text];
}
注意resultReady參数设置为一个遵守GNSearchResultReady协议的对象,也就是self。
config參数设置为全局的配置。
artist,albumTitle,trackTitle分别为艺术家,专辑名称,音乐名等,这些是搜索的Key,三个參数最多能够缺省两个。
第三步,在查询成功后,我们能够从GNResultReady:方法中获取server返回的数据,从中剥离出我们须要的信息。可是,很奇怪的是,对于返回结果中的每个GNSearchResponse对象,其AlbumCoverArt均为nil。例如以下图所看到的,注意是10个对象中的每个对象的m_coverArt的值都是nil。
替代的方法是,记录下GNSearchResponse对象的Id信息,然后通过AlbumId发起二次请求,从server中获取完整的专辑信息(这样做确实不好,可是眼下我仅仅找到这个解决方法)
#pragma mark - GNSearchResultReady Protocol - (void)GNResultReady:(GNSearchResult *)result
{
NSArray *responses = [result responses];
if (!responses || !responses.count) {
[[[UIAlertView alloc] initWithTitle:@"对不起" message:@"没有找到不论什么匹配结果" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show];
[_checking_activityIndicator stopAnimating];
self.view.userInteractionEnabled = YES;
self.view.alpha = 1.0;
_check_button.hidden = NO;
return;
} [_albumIDArray removeAllObjects]; int i = 0;
for (GNSearchResponse *resp in responses) {
if (i == 10) {
break;
} NSString *albumID = resp.albumId;
if (albumID) {
[_albumIDArray addObject:albumID];
i++;
}
} if (!_albumIDArray.count) {
[[[UIAlertView alloc] initWithTitle:@"对不起" message:@"没有找到不论什么匹配结果" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show];
return;
}
else {
[self performSegueWithIdentifier:@"check_segue" sender:self];
[_checking_activityIndicator stopAnimating];
self.view.userInteractionEnabled = YES;
self.view.alpha = 1.0;
_check_button.hidden = NO;
}
}
在下一个视图中通过AlbumID发起二次请求:
- (void)getAlbumLists {
[_albumInfo removeAllObjects]; for (NSString *album_id in _albumIDs) {
[GNOperations fetchByAlbumId:self
config:((AppDelegate *)[[UIApplication sharedApplication] delegate]).app_gnConfig
albumId:album_id];
}
}
上几张执行结果图:
这个Demo通过音乐名/专辑名/艺术家获取到专辑封面,歌曲风格,完整的歌曲名,完整的艺术家列表,歌曲风格,发行信息等相对较为完整的信息,重点是拿到了专辑的封面。真机调试过,没什么问题,看来我能够交差了。
完整的代码我就不贴出来了,有兴趣的下载Demo看看。
说明:因为GraceNote的SDK有71M,在Demo中我将其移除,因此Demo是无法执行的。请自行到GraceNote站点中下载GraceNoteMusicID.framework并加入到project中。
Use GraceNote SDK in iOS(二)获取音乐的完整信息的更多相关文章
- Use GraceNote SDK in iOS(一)通过序列化GDO查询专辑封面
于Use MusicBrainz in iOS之后,因为MusicBrainz找出专辑封面,它只能转移到其他网站提供的音乐信息搜索服务,领导给出GraceNote.(有压力.. .) 需求类似:通过一 ...
- ArcGIS Runtime SDK for iOS中获取ImageServiceLayer的栅格值
本文原创,转载请注明原创地址 http://blog.csdn.net/dongyu1009/article/details/37697389 用AGSImageServiceIdentifyTask ...
- Java并发学习之二——获取和设置线程信息
本文是学习网络上的文章时的总结,感谢大家无私的分享. Thread类的对象中保存了一些属性信息可以帮助我们辨别每个线程.知道它的一些信息 ID:每一个线程的独特标示: Name:线程的名称: Prio ...
- 利用php获取图片完整Exif信息类 获取图片详细完整信息类
<?php /** * @Author: TonyLevid * @Copyright: TonyLevid.com * @Name: Image Exif Class * @Version: ...
- Use MusicBrainz in iOS(三)查询专辑的完整信息
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u010962810/article/details/24066737 本文讨论下通过专辑名获取专辑的 ...
- iOS如何获取网络图片(二)
ios如何获取图片(二)无沙盒下 解决问题 *解决问题1:tableView滑动卡顿,图片延时加载 解决方法:添加异步请求,在子线程里请求网络,在主线程刷新UI *解决问题2:反复请求网络图片,增加用 ...
- iOS - 音乐播放器之怎么获取音乐列表
方法一: 这个方法是通过获取到沙盒路径,来得到音乐的路径(使用这个方法需要把音乐放进沙盒) NSFileManager *manager = [NSFileManager defaultManager ...
- iOS 7 SDK: 如何使用后台获取(Background Fetch)
本文转载至 http://www.cocoachina.com/applenews/devnews/2013/1114/7350.html 本文主要教你如何使用iOS 7 SDK多任务处理API--B ...
- 使用GraceNote Web API发展Mac发现音乐信息的应用
好久没有写博客,最近各种忙,特别忙里忙,今晚难得清闲.写最近完成下一个博客任务的摘要:使用GraceNote的Web API开发一个查询的音乐信息的应用,事实上,并在这些功能的前GraceNote S ...
随机推荐
- Python web框架有哪些
简单易学的web.py, 大型的django:文档最完善.市场占有率最高.招聘职位最多. Tornado 具体看:http://feilong.me/2011/01/talk-about-python ...
- python list comprehension twos for loop 嵌套for循环
list comprehension 后面可以有多个for loops,每个for后面可以有if [(x, y, x * y)for x in(0,1,2,3)for y in(0,1,2,3)if ...
- Android Camera调用过程分析
源代码版本:allwinner 4.0.4 frameworks代码: frameworks/base/core/java/android/hardware/Camera.java JNI层代码: f ...
- php 判断是否登录
<?php // 本类由系统自动生成,仅供测试用途 class IndexAction extends Action { public function _before_index(){ //做 ...
- python none,null,,,,,类型
内建类型None表示一个空对象,没有方法和属性. None是一个特殊的常量. None和False不同. None不是0. None不是空字符串. None和任何其他的数据类型比较永远返回False. ...
- codeblocks快捷键及设置
==日常编辑== • 按住Ctrl滚滚轮,代码的字体会随你心意变大变小.• 在编辑区按住右键可拖动代码,省去拉(尤其是横向)滚动条之麻烦:相关设置:Mouse Drag Scrolling.• Ctr ...
- C++一些注意点之异常处理
几篇文章:(1)http://blog.csdn.net/daheiantian/article/details/6530318 (2)http://blog.chinaunix.net/uid-21 ...
- Xcode 静态库调试策略
Xcode 静态库调试策略 (已经有现成的工程和静态库源码) ***** 为安全期间建议备份一下静态库 Step1: 下载最新的工程[工程中有所要测试的静态库和头文件需要删除]: Step2: ...
- linux命令sysctl使用
以前没有注意过这个命令,直到有次在单位安装greenplum的时候,在没有配置系统参数的情况下,出现了设备空间不足的报错信息. 当然,安装的不是我的本机,而是公用的服务器,编辑修改系统参数后,仍然出现 ...
- ASP.NET MVC 5 学习教程:创建连接字符串
原文 ASP.NET MVC 5 学习教程:创建连接字符串 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...