我构建了这个漂亮的小weather/clock app作为一种学习API的方式,并且包含了雅虎天气api和flickr api。现在它的功能正常,我决定通过Flash Builder 4.4 ActionScript Mobile项目将它移植到Playbook应用程序中。我能够将它安装在Playbook模拟器上,但是当它启动时它显示出一个空白阶段。经过几个小时的研究,我确定这是一个运行时错误。Flash Builder 4.5,SecurityError:Error#3207 for flickr api
经过几个小时的研究,我发现在向flickr api发出呼叫时出现安全错误。调试器报告以下错误:
SecurityError: Error #3207: Application-sandbox content cannot access this feature. at flash.system::Security$/allowDomain() at global$init()[C:\Users\poorpaddy\Adobe Flash Builder 4.5\Scripts\flickrGrabber.as:43] at Weather/addGrabberEvents()[C:\Users\poorpaddy\Adobe Flash Builder 4.5\Weather\src\Weather.as:36] at Weather()[C:\Users\poorpaddy\Adobe Flash Builder 4.5\Weather\src\Weather.as:22]
我已经试过的
Security.allowDomain(FLICKR_URL);
Security.loadPolicyFile(CROSSDOMAIN_URL);
几个例子没有任何的运气。这是我的flickrGrabber类。
package {
import flash.display.Bitmap;
import flash.events.ErrorEvent;
import flash.events.EventDispatcher;
import flash.display.Loader;
import flash.events.Event;
import flash.events.ErrorEvent;
import flash.events.IOErrorEvent;
import com.adobe.webapis.flickr.events.FlickrResultEvent;
import com.adobe.webapis.flickr.*;
import flash.net.URLRequest;
import flash.system.Security;
import flash.system.LoaderContext;
//
public class flickrGrabber extends EventDispatcher {
private const FLICKR_URL:String = "flickr.com";
private const CROSSDOMAIN_URL:String = "http://api.flickr.com/crossdomain.xml";
private var imageLoader:Loader
//
private var fs:FlickrService;
private var activeUser:User;
private var photoList:PagedPhotoList
private var constrainWidth:Number;
private var constainHeight:Number;
private var photoPosition:Number = 0;
private var flickrSource:String;
private var searchType:String;
private var doUserSearch:Boolean;
private var userData:User;
private var activePhoto:Photo;
private var otherDataRecieved:Boolean;
public function flickrGrabber(parentWidth:Number, parentHeight:Number, api:String, secret:String, flickrSearchTerm:String, searchByUser:Boolean = false) {
constrainWidth = parentWidth;
constainHeight = parentHeight;
flickrSource = flickrSearchTerm
doUserSearch = searchByUser;
//
imageLoader = new Loader();
imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageReady);
imageLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onImageError);
//
Security.allowDomain(FLICKR_URL);
Security.loadPolicyFile(CROSSDOMAIN_URL);
//
fs = new FlickrService(api);
//
fs.addEventListener(FlickrResultEvent.AUTH_GET_FROB, hGetFrob);
fs.addEventListener(FlickrResultEvent.PHOTOS_GET_SIZES, recievePhotoSize);
fs.addEventListener(FlickrResultEvent.PEOPLE_GET_INFO, recieveUserInfo);
fs.addEventListener(FlickrResultEvent.PEOPLE_FIND_BY_USERNAME, userSearchResults);
fs.addEventListener(FlickrResultEvent.PEOPLE_GET_PUBLIC_PHOTOS, recievePhotoList);
fs.addEventListener(FlickrResultEvent.PHOTOS_SEARCH , recievePhotoList);
//
fs.secret = secret;
//
fs.auth.getFrob();
}
private function hGetFrob(evt:FlickrResultEvent):void {
if (evt.success) {
if (doUserSearch){
fs.people.findByUsername(flickrSource);
}else {
fs.photos.search("", flickrSource, "any", "", null, null, null, null, -1, "", 100, 1, "interestingness-desc");
}
} else {
reportError("Error obtaining Frob from flickr");
}
}
private function userSearchResults(evt:FlickrResultEvent):void {
if (evt.success) {
activeUser = evt.data.user;
fs.people.getPublicPhotos(activeUser.nsid);
} else {
reportError("Count not find specified user name");
}
}
private function recievePhotoList(evt:FlickrResultEvent):void {
photoList = evt.data.photos as PagedPhotoList;
if (photoList.total > 0){
dispatchEvent(new Event("flickrConnectionReady", false));
} else {
reportError("No results recieved for user/search");
}
}
public function loadNextImage():void {
activePhoto = photoList.photos[photoPosition];
otherDataRecieved = false;
fs.people.getInfo(activePhoto.ownerId);
fs.photos.getSizes(activePhoto.id);
//
if (photoPosition+1 > photoList.photos.length-1) {
photoPosition = 0;
} else {
photoPosition ++
}
}
private function recieveUserInfo(evt:FlickrResultEvent):void {
userData = evt.data.user as User;
checkReadyStatus();
}
private function recievePhotoSize(evt:FlickrResultEvent):void {
if (evt.success){
var sizeArr:Array = evt.data.photoSizes;
var sizeObject:PhotoSize = sizeArr[i];
//Pull the photo that is closest to the target size.
for (var i:int = 0; i < sizeArr.length; i++) {
sizeObject = sizeArr[i];
if (sizeObject.width > constrainWidth || sizeObject.height > constainHeight) {
break;
}
}
imageLoader.load(new URLRequest(sizeObject.source), new LoaderContext(true));
} else {
reportError("Photo sizes were not recieved");
}
}
private function checkReadyStatus():void {
if (otherDataRecieved) {
dispatchEvent(new Event("imageReady"));
} else {
otherDataRecieved = true;
}
}
//
private function onImageReady(evt:Event):void {
try {
var imageAlias:Bitmap = imageLoader.content as Bitmap;
} catch (e:Error) {
reportError("Returned image was not a proper bitmap: " + imageLoader.loaderInfo.url);
}
checkReadyStatus();
}
private function onImageError(evt:IOErrorEvent):void {
reportError("Error loading image: " + imageLoader.loaderInfo.url);
}
public function get image():Bitmap {
return imageLoader.content as Bitmap;
}
public function get imageTitle():String {
return activePhoto.title;
}
public function get imageAuthor():String {
return userData.fullname;
}
private function reportError(errorString:String):void {
dispatchEvent(new ErrorEvent("flickrGrabberError", false, false, errorString));
}
}
}
这里是我的DocumentClass/Weather.as引用flickerGRabber类。
package
{
import flash.display.MovieClip;
import flickrGrabber;
import flash.events.*;
public class Weather extends MovieClip
{
private var apiKey:String = "###removed for this posting###";
private var apiSecret:String = "###removed for this posting###";
public var flickrLocationName:String = "San Diego";
private var grabber:flickrGrabber;
private var la:LoadAnimation = new LoadAnimation;
public var backgroundClip:MovieClip;
private var clock:ClockObject = new ClockObject;
public var foreCast:WeatherObject = new WeatherObject;
private var settingsPanel:KeyboardObject = new KeyboardObject;
public function Weather()
{
addGrabberEvents();
clock.x = 492;
clock.y = 375;
addChild(clock);
foreCast.x = 27;
foreCast.y = 12;
addChild(foreCast);
settingsPanel.x = 38;
settingsPanel.y = 28;
addChild(settingsPanel);
}
public function addGrabberEvents():void
{
grabber = new flickrGrabber(1024,600,apiKey,apiSecret,flickrLocationName,false);
grabber.addEventListener("imageReady", onLoadedImage);
grabber.addEventListener("flickrGrabberError", onErrorImage);
grabber.addEventListener("flickrConnectionReady", onFlickrReady);
}
public function onFlickrReady(evt:Event):void
{
la.x = stage.stageWidth - (la.width + 20);
la.y = 20;
addChild(la);
grabber.loadNextImage();
}
public function onLoadedImage(evt:Event):void
{
backgroundClip = new MovieClip();
addChildAt(backgroundClip,0);
backgroundClip.addChild(grabber.image);
removeChild(la);
}
public function removeMe(e:MouseEvent):void
{
removeChild(backgroundClip);
addGrabberEvents();
settingsPanel.closeKeyboard(null);
settingsPanel.keyBoardPanel.statusMessage.msg_txt.text = ""
settingsPanel.keyBoardPanel.zipCodeEntry.zipCodeTxt.text = ""
}
public function onErrorImage(evt:ErrorEvent):void
{
trace("Report error: " + evt.text);
}
}
}
您的协助将非常感激,我一直坚持了几天。
我也会评论说,在运行独立安装的AIR应用程序时,您不需要安全策略来允许域。 (这不适用于在沙盒/ Flash Player中运行的Flash) – 2012-03-08 10:53:26
谢谢,我终于搞定了。看到这里:http://truimage.biz/WAS400/PlaybookApp/weatherApp.html – 2012-07-04 05:45:12