AS3:如何获取 JPG / PNG 屏幕截图并将其保存到 Android 手机的 SDCard 目录
AS3: How to take JPG / PNG screenshot and save it to SDCard directories of Android mobile
我制作了一个 Android 移动应用程序,方法是截屏并将其保存为 JPG / PNG 格式并保存到 android 移动设备上的目录 SDCard / 内部存储中。
当我在桌面上尝试时,一切正常,没有问题。在我将 .apk
发布并安装到移动设备 Android 后,如果我点击保存按钮,我会收到这样的错误
"Unfortunately, My application has stopped."
谁能帮我解决这个错误?
这是我的代码:
import flash.events.MouseEvent;
import flash.display.MovieClip;
import flash.display.DisplayObject;
import com.adobe.images.JPGEncoder;
btn_save.addEventListener(MouseEvent.CLICK, save_image);
function save_image(e:MouseEvent):void
{
btn_back.visible = false;
btn_save.visible = false;
var qImageData:BitmapData = new BitmapData(540, 960);
qImageData.draw(stage);
var qEncoder:JPGEncoder = new JPGEncoder(100);
var qBytes:ByteArray = qEncoder.encode(qImageData);
var qfile:FileReference = new FileReference();
var names:String = "Image_name";
qfile.save(qBytes, names+".jpg");
btn_back.visible = true;
btn_save.visible = true;
}
谢谢。
由于 权限 问题(不允许将数据写入设备),它正在崩溃。
研究如何通过 AIR/AS3 或编码工具 (IDE) 输出选项允许此类权限。
同时考虑:
- 添加
import flash.net.FileReference;
.
确保变量在函数外声明。
否则var qfile:FileReference
只会在函数触发时才开始存在。这对于桌面上的 Flash Player 来说很好,但在移动设备上,您的应用程序必须与 Android OS 通信,其中 OS 可能不喜欢突然出现的某些(以前)未声明的文件系统编辑变量在函数内...
:FileReference
在桌面上弹出一个 "Save As" 对话框,它在移动设备上如何工作?也许您应该(如预期的那样)使用 AIR 的 FileSystem
API 制作一个 :File
类型,以便在单击 "save" 按钮时自动保存到 SD 卡?
检查这些 search results 以获得有关其他人如何做的提示。
(更新代码):未经测试但首先尝试设置如下代码...
(如果不起作用则研究权限问题,也尝试File
而不是 FileReference
)
//## 1) add imports
import flash.events.MouseEvent;
import flash.display.MovieClip;
import flash.display.DisplayObject;
import com.adobe.images.JPGEncoder;
import flash.net.FileReference; //add this
//## 2) declare variables
var names:String = "Image_name";
var qImageData:BitmapData;
var qEncoder:JPGEncoder;
var qBytes:ByteArray;
//var qfile:FileReference = new FileReference();
var qFile:File = File.userDirectory.resolvePath(names+".jpg");
var qFStream:FileStream = new FileStream();
//## 3) add any required listeners
btn_save.addEventListener(MouseEvent.CLICK, save_image);
//## 4) declare all functions here onwards
function save_image(e:MouseEvent):void
{
btn_back.alpha = 0.4; //btn_back.visible = false;
btn_save.alpha = 0.4; //btn_save.visible = false;
qImageData = new BitmapData(540, 960);
qImageData.draw(stage);
qEncoder = new JPGEncoder(100);
qBytes = qEncoder.encode(qImageData);
//var qfile:FileReference = new FileReference();
//var names:String = "Image_name";
//qfile.save(qBytes, names+".jpg");
qBytes.position = 0;
qFStream.open(qFile, FileMode.WRITE);
qFStream.writeBytes(qBytes, 0, qBytes.length);
qFStream.close();
btn_back.alpha = 0.4; //btn_back.visible = true;
btn_save.alpha = 0.4; //btn_save.visible = true;
//## Check if file (qFile) was created successfully (it exists on SD card)
if (qFile.exists)
{
//# Do something if "The File Exists" on the SD card...
}
else
{
//# Here will handle case of "No File Created"...
}
}
还要确保您的 Android manifest allows WRITE
权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
它将是一个名为 app.xml
或 YourFileName-app.xml
的文件。确保它是这样的:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<application xmlns="http://ns.adobe.com/air/application/2.5">
<id>author.YourFileName</id>
<versionNumber>1.0.0</versionNumber>
<versionLabel/>
<filename>YourFileName</filename>
<description/>
<!-- To localize the description, use the following format for the description element.<description><text xml:lang="en">English App description goes here</text><text xml:lang="fr">French App description goes here</text><text xml:lang="ja">Japanese App description goes here</text></description>-->
<name>YourFileName</name>
<!-- To localize the name, use the following format for the name element.<name><text xml:lang="en">English App name goes here</text><text xml:lang="fr">French App name goes here</text><text xml:lang="ja">Japanese App name goes here</text></name>-->
<copyright/>
<initialWindow>
<content>YourFileName.swf</content>
<systemChrome>standard</systemChrome>
<transparent>false</transparent>
<visible>true</visible>
<fullScreen>true</fullScreen>
<renderMode>gpu</renderMode>
<autoOrients>true</autoOrients>
</initialWindow>
<icon>
<image72x72>My_Assets/icons/YourFileName_icon_72.png</image72x72>
<image48x48>My_Assets/icons/YourFileName_icon_48.png</image48x48>
<image36x36>My_Assets/icons/YourFileName_icon_36.png</image36x36>
</icon>
<customUpdateUI>false</customUpdateUI>
<allowBrowserInvocation>false</allowBrowserInvocation>
<android>
<manifestAdditions>
<![CDATA[<manifest>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>]]>
</manifestAdditions>
</android>
</application>
我制作了一个 Android 移动应用程序,方法是截屏并将其保存为 JPG / PNG 格式并保存到 android 移动设备上的目录 SDCard / 内部存储中。
当我在桌面上尝试时,一切正常,没有问题。在我将 .apk
发布并安装到移动设备 Android 后,如果我点击保存按钮,我会收到这样的错误
"Unfortunately, My application has stopped."
谁能帮我解决这个错误?
这是我的代码:
import flash.events.MouseEvent;
import flash.display.MovieClip;
import flash.display.DisplayObject;
import com.adobe.images.JPGEncoder;
btn_save.addEventListener(MouseEvent.CLICK, save_image);
function save_image(e:MouseEvent):void
{
btn_back.visible = false;
btn_save.visible = false;
var qImageData:BitmapData = new BitmapData(540, 960);
qImageData.draw(stage);
var qEncoder:JPGEncoder = new JPGEncoder(100);
var qBytes:ByteArray = qEncoder.encode(qImageData);
var qfile:FileReference = new FileReference();
var names:String = "Image_name";
qfile.save(qBytes, names+".jpg");
btn_back.visible = true;
btn_save.visible = true;
}
谢谢。
由于 权限 问题(不允许将数据写入设备),它正在崩溃。
研究如何通过 AIR/AS3 或编码工具 (IDE) 输出选项允许此类权限。
同时考虑:
- 添加
import flash.net.FileReference;
. 确保变量在函数外声明。
否则var qfile:FileReference
只会在函数触发时才开始存在。这对于桌面上的 Flash Player 来说很好,但在移动设备上,您的应用程序必须与 Android OS 通信,其中 OS 可能不喜欢突然出现的某些(以前)未声明的文件系统编辑变量在函数内...:FileReference
在桌面上弹出一个 "Save As" 对话框,它在移动设备上如何工作?也许您应该(如预期的那样)使用 AIR 的FileSystem
API 制作一个:File
类型,以便在单击 "save" 按钮时自动保存到 SD 卡?检查这些 search results 以获得有关其他人如何做的提示。
(更新代码):未经测试但首先尝试设置如下代码...
(如果不起作用则研究权限问题,也尝试File
而不是 FileReference
)
//## 1) add imports
import flash.events.MouseEvent;
import flash.display.MovieClip;
import flash.display.DisplayObject;
import com.adobe.images.JPGEncoder;
import flash.net.FileReference; //add this
//## 2) declare variables
var names:String = "Image_name";
var qImageData:BitmapData;
var qEncoder:JPGEncoder;
var qBytes:ByteArray;
//var qfile:FileReference = new FileReference();
var qFile:File = File.userDirectory.resolvePath(names+".jpg");
var qFStream:FileStream = new FileStream();
//## 3) add any required listeners
btn_save.addEventListener(MouseEvent.CLICK, save_image);
//## 4) declare all functions here onwards
function save_image(e:MouseEvent):void
{
btn_back.alpha = 0.4; //btn_back.visible = false;
btn_save.alpha = 0.4; //btn_save.visible = false;
qImageData = new BitmapData(540, 960);
qImageData.draw(stage);
qEncoder = new JPGEncoder(100);
qBytes = qEncoder.encode(qImageData);
//var qfile:FileReference = new FileReference();
//var names:String = "Image_name";
//qfile.save(qBytes, names+".jpg");
qBytes.position = 0;
qFStream.open(qFile, FileMode.WRITE);
qFStream.writeBytes(qBytes, 0, qBytes.length);
qFStream.close();
btn_back.alpha = 0.4; //btn_back.visible = true;
btn_save.alpha = 0.4; //btn_save.visible = true;
//## Check if file (qFile) was created successfully (it exists on SD card)
if (qFile.exists)
{
//# Do something if "The File Exists" on the SD card...
}
else
{
//# Here will handle case of "No File Created"...
}
}
还要确保您的 Android manifest allows WRITE
权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
它将是一个名为 app.xml
或 YourFileName-app.xml
的文件。确保它是这样的:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<application xmlns="http://ns.adobe.com/air/application/2.5">
<id>author.YourFileName</id>
<versionNumber>1.0.0</versionNumber>
<versionLabel/>
<filename>YourFileName</filename>
<description/>
<!-- To localize the description, use the following format for the description element.<description><text xml:lang="en">English App description goes here</text><text xml:lang="fr">French App description goes here</text><text xml:lang="ja">Japanese App description goes here</text></description>-->
<name>YourFileName</name>
<!-- To localize the name, use the following format for the name element.<name><text xml:lang="en">English App name goes here</text><text xml:lang="fr">French App name goes here</text><text xml:lang="ja">Japanese App name goes here</text></name>-->
<copyright/>
<initialWindow>
<content>YourFileName.swf</content>
<systemChrome>standard</systemChrome>
<transparent>false</transparent>
<visible>true</visible>
<fullScreen>true</fullScreen>
<renderMode>gpu</renderMode>
<autoOrients>true</autoOrients>
</initialWindow>
<icon>
<image72x72>My_Assets/icons/YourFileName_icon_72.png</image72x72>
<image48x48>My_Assets/icons/YourFileName_icon_48.png</image48x48>
<image36x36>My_Assets/icons/YourFileName_icon_36.png</image36x36>
</icon>
<customUpdateUI>false</customUpdateUI>
<allowBrowserInvocation>false</allowBrowserInvocation>
<android>
<manifestAdditions>
<![CDATA[<manifest>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>]]>
</manifestAdditions>
</android>
</application>