【问题标题】:as3 Air for Android downloading and saving remote filesas3 Air for Android 下载和保存远程文件
【发布时间】:2026-01-31 02:30:01
【问题描述】:

下面的代码使用 as3 Air For Android 从服务器下载 mp3 到您的手机。我想稍后在应用程序中使用这些文件,所以我有以下问题:

我怎样才能使文件保存到 android 应用程序中的特定文件夹,而不是打开一个框供用户选择位置?

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);

监控这个进度也很不错,当它开始、停止和进展时,但我认为 eventListener 可能会与它一起工作。

【问题讨论】:

  • 您是在使用 AIR 将本机应用程序部署到 android,还是只是想在浏览器中运行 swf。如果是后者,出于安全原因,我认为不可能绕过保存对话框,否则站点可能会任意将文件放到您的计算机上……使用 AIR,您可以将内容添加到清单中以在安装过程中请求特定权限,例如作为读取/写入文件到外部存储,我相信默认情况下 AIR 应用程序具有读取/写入应用程序文件夹的能力。对于 AIR,使用 FileStream 和 File 类。
  • 我正在使用 Air。我会澄清的。
  • 我相信我从 URLLoader 获取数据,然后使用 FileStream 保存它。但我不知道该怎么做。 :(
  • 取决于您的 URLLoader.load 调用的结果是什么,您将使用什么特定方法将数据写入文件,但阅读此处的页面应该有助于理解如何使用 FileStream 类写入文件help.adobe.com/en_US/as3/dev/…

标签: android actionscript-3 flash filereference


【解决方案1】:

以下代码从远程 url 下载 mp3 并创建一个名为 .007 的文件夹(您可以更改名称或添加多个文件夹或不添加文件夹)。然后保存到那个位置。

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.");
}

附注请记住在应用程序中使用 Android 授予正确的权限

【讨论】:

    【解决方案2】:

    我到处寻找有关如何下载等的答案...

    我个人更喜欢从 Greenshocks AS3 库中使用 LoaderMax 下载任何文件(自从它是一个轻量级加载器以来,它已经包含在我的大多数项目中。


    我没有指定一个本地 URL,而是指定一个远程 URL。 让我给你看一些代码:

    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();
    }
    

    下面是 COMPLETE 事件的处理程序。您还可以为您命名的 ERROR、FAIL、PROGRESS 等设置处理程序..

    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();
    }   
    

    请记住,LoaderMax 并不真正关心文件是本地文件还是远程文件,它只是将其加载到内存中..


    从那时起,您可以决定是将其保存为文件还是仅使用它然后丢弃它。

    如果您想将其保存为文件,方法如下:(以下 iOs 示例)

    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(); 
    

    【讨论】: