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 ...
随机推荐
- QT图片旋转
目前发现有两种方法,如下: 1.使用QPixmap的transformed函数旋转,这个函数默认是以图片中心为旋转点,不能随意设置旋转点,使用如下: QMatrix leftmatrix; leftm ...
- poj 2833 The Average(堆)
题目链接:http://poj.org/problem?id=2833 思路分析:由于数据量较大,超出存储范围,使用不能使用数组存储数据在进行排序.考虑维护一个最大堆与最小堆,依次读取数据, 记录数据 ...
- FMDB 的基本操作
在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包 FMDB同时兼容ARC和非ARC工程,会自动根据工程配置来调整相关的内存管理代码. FMDB常用类: F ...
- android-改进<<仿QQ>>框架源代码
该文章主要改动于CSDN某大神的一篇文章,本人认为这篇文章的面向对象非常透彻,以下分享例如以下可学习的几点: Android应用经典主界面框架之中的一个:仿QQ (使用Fragment, 附源代码) ...
- 记录一次SQL查询语句
以前发现比较经典的句子,都是记录在电脑上,我今天想搬到博客上,在我看来,写博客真的是一件非常头疼的事,它是内心的一道坎,我必须得跨过它. CREATE TABLE t_jeff ( id int NO ...
- ViewPager实现启动引导页面(个人认为很详细)
效果如图: 启动页面是一张图片+延时效果,这里就不给出布局文件了. WelcomeActivity分析:在启动页面检测是否是第一次运行程序,如果是,则先跳转到引导界面的Activity——AndyVi ...
- C# 网络编程 Part.1
本人也是新手,对网络编程一窍不通,所以从今天开始我将学习网络编程的基础知识,在此一一贴出来,编辑成一个系列! 1.为自己复习巩固用 2.可以找到同时在学习网络编程的同学,一起讨论交流,促进学习效率及其 ...
- Struts1的处理流程
本文从收到一个请求开始讲述,忽略之前的filter等工作. 处理工作的主要承担者为RequestProcessor 1.处理请求的url. RequestProcessor.processPath(r ...
- 彻底理解浮动float CSS浮动详解 清除浮动的方法
我们把网页的常用的布局格式分为以下三种: 1.标准流. 所谓的标准流就是,行内元素自己单独一行,而块级元素是上下显示的. 以前我们学习的都是标准流. 注意:标准流使我们网页布局中最稳定的一种结构 ...
- yii_wiki_204_using-cjuidialog-to-edit-rows-in-a-cgridview(通过CJuiDialog在CGridView中修改行数据)
/*** Using CJuiDialog to edit rows in a CGridView http://www.yiiframework.com/wiki/204/using-cjuidia ...