问题
The Code below downloads an mp3 to your phone from a server using as3 Air For Android. I want to use these files later in the app so I have the following question:
How can I make it so the files save to a particular folder in the android app rather than a box opening for the user to choose a location?
import flash.net.FileReference;
/// It can be an mp3,jpg, png, etc... just change the url
/// and the extension name. nice huh?
var yourFileLocation = "http://YourWeb.com/YourSong.mp3";
var yourFileName = "YourSong.mp3";
var daFile:FileReference = new FileReference();
daFile.download(new URLRequest(yourFileLocation), yourFileName);
Would also be sweet to monitor this progress, when it starts, stops and progress but I think an eventListener might work with that.
回答1:
The Following Code downloads an mp3 from a remote url and makes a folder called .007(You can change the name or add many or no folders). Then it saves to that location.
import flash.filesystem.*;
/// Change the line below to point to your mp3 online
var urlString:String = "http://YourWebsite.com/YourSound.mp3";
var urlReq:URLRequest = new URLRequest(urlString);
var urlStream:URLStream = new URLStream();
var fileData:ByteArray = new ByteArray();
urlStream.addEventListener(Event.COMPLETE, loaded);
urlStream.load(urlReq);
function loaded(event:Event):void
{
urlStream.readBytes(fileData, 0, urlStream.bytesAvailable);
writeAirFile();
}
function writeAirFile():void
{
// Change the folder path to whatever you want plus name your mp3
// If the folder or folders does not exist it will create it.
var file:File = File.userDirectory.resolvePath(".007/Yahoo.mp3");
var fileStream:FileStream = new FileStream();
fileStream.open(file, FileMode.WRITE);
fileStream.writeBytes(fileData, 0, fileData.length);
fileStream.close();
trace("The file is written.");
}
P.S. REMEMBER TO GRANT THE CORRECT PERMISSIONS USING ANDROID IN THE APP
回答2:
I was looking all over the place for an answer on how to download etc...
What I personally prefer is to download any file with LoaderMax from Greenshocks AS3 library (which is already included in most of my projects since its a kick-ass lightweight loader.
Instead of specifying a URL which is local i specify a URL which is remote.. lemme show you some code:
public function downloadTxtJpgMp3():void
{
var queue:LoaderMax = new LoaderMax();
emptyLoader(); //this emptys the loader from previous attempts to load any files
queue.append( new DataLoader("http://www.70disco.com/lyrics/delegation_you_and_I.txt",{name:"test_txt" ,format:"text", estimatedBytes:4000}) );
queue.append( new ImageLoader( "http://4.bp.blogspot.com/-WQ3uAvGdPS0/UOB_OPS6rcI/AAAAAAAAKkU/HYaXXHVHTqc/s1600/whatever-dude-whatever.jpg" , {name:"test_img" , estimatedBytes:77000, container:this, alpha:0, scaleMode:"proportionalInside"}) );
queue.append( new MP3Loader( "http://nocturno.nsk.pt/otherpages/funny/mp3/2001-02/Cebola%20Mol/Cebola%20Mol%20-%20Satright%20No%20Chaser%20II.mp3" , {name:"test_mp3" , repeat:0, autoPlay: false}) );
queue.addEventListener(LoaderEvent.COMPLETE, onDownloadComplete);
queue.load();
}
And below is the handler for the COMPLETE event. You can also have handler for ERROR,FAIL,PROGRESS etc you name it..
protected function onDownloadComplete(event:LoaderEvent):void
{
var objects:Array = event.currentTarget.content ;
var firstObjectILoaded: String //txt
var secondObjectILoaded:Bitmap //jpg
var thirdObjectILoaded: Sound //mp3
// ContentDisplay is found within greenshock
firstObjectILoaded = objects[0];
secondObjectILoaded = ((objects[1] as ContentDisplay).rawContent as Bitmap)
thirdObjectILoaded = objects[2];
trace(firstObjectILoaded);
thirdObjectILoaded.play();
}
Remember LoaderMax does not really care whether the file is local or remote, it just loads it into memory..
From that point on you can decide whether you want to save it as a file or just use it and then discard it.
If you want to save it as a file here is how: (iOs example below)
var str:String = File.applicationDirectory.nativePath;
//in iOs you can save on 4 different folder directories (according to apples rules)
// cache, temp, app support, and user documents (i don't cover this below)
appCache = new File(str +"/\.\./Library/Caches"); //cache folder (in which you put files that you dont care being erased. the iOs might delete those files in case of low memory
appTempData = new File(str +"/\.\./tmp"); //temp folder (just files you temporarily want to store
appData = new File(str +"/\.\./Library/Application\ Support"); //any file your application NEEDS in order to operate, this can't be deleted by the os
var fr:FileStream = new FileStream();
fr.open(
appTempData // appTempData or appCache or appData or userDocs
.resolvePath("myCache.txt"),FileMode.WRITE);
fr.writeUTFBytes("works");
fr.close();
来源:https://stackoverflow.com/questions/12031095/as3-air-for-android-downloading-and-saving-remote-files