AS3:如何截取JPG/PNG截图并保存到Android手机的SDCard目录

Posted

技术标签:

【中文标题】AS3:如何截取JPG/PNG截图并保存到Android手机的SDCard目录【英文标题】:AS3: How to take JPG / PNG screenshot and save it to SDCard directories of Android mobile 【发布时间】:2018-04-10 17:37:30 【问题描述】:

我通过截取屏幕截图并将其保存为 JPG / PNG 格式并保存到 android 手机上的目录 SDCard / Internal storage 制作了一个 Android 移动应用程序。

当我在桌面上尝试时,一切正常,没有问题。在我将.apk 发布并安装到移动 Android 中后,如果我点击保存按钮,我会收到这样的错误

“很遗憾,我的应用程序已停止。”

谁能帮我解决这个错误?

这是我的代码:

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;

谢谢。

【问题讨论】:

引用:save() 方法首先打开一个操作系统对话框,要求用户输入文件名并在本地计算机上选择一个位置来保存文件。 我不认为Android 有对话框这样的东西。您应该改用 FileFileStream 类。 感谢您的回复,您能否在编码或链接中给我一个示例,我应该修复上述代码的哪一部分? ***.com/questions/7858670/… 检查我的答案中的更新信息。希望对您有所帮助。 【参考方案1】:

由于权限问题(不允许将数据写入设备)而崩溃。 研究如何通过 AIR/AS3 或编码工具 (IDE) 选项允许此类权限用于输出。

同时考虑:

添加import flash.net.FileReference;

确保在函数之外声明变量。 否则var qfile:FileReference只会在函数触发时才开始存在。这对于桌面上的 Flash Player 来说很好,但在移动设备上,您的应用程序必须与 Android 操作系统对话,而该操作系统可能不喜欢某些(以前)突然出现在函数中的未声明的文件系统编辑变量......

李>

:FileReference 在桌面上弹出一个“另存为”对话框,这在移动设备上是如何工作的?也许您应该(如预期的那样)使用 AIR 的 FileSystem API 来制作 :File 类型,以便在单击“保存”按钮时自动保存到 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.xmlYourFileName-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>

【讨论】:

感谢 VC.One,您教我编写正确的代码,我已将 FileReference 替换为 FileStream 但是当我在 android 上运行它时,btn_save 无法打开 android 移动目录文件并且没有任何反应将该屏幕截图保存为 JPG。你能再帮我一次怎么做codenya吗? @IWayanArthana 我不在带 Flash 的计算机上,所以在回复之前我无法测试任何代码。给我一些提示... (1) 您在尝试保存时是否收到任何错误消息? (2) 你能确定什么都不会发生吗?我的意思是单击save_btn 应该会启动一个静默保存过程(文件只出现在目标文件夹中),所以请检查您的目标文件夹... (3) 我建议您Edit your Question 显示您使用的代码。将更容易检查问题。谢谢 感谢您对我的教导和帮助,抱歉回复您的cmets晚了,我会尝试您的建议

以上是关于AS3:如何截取JPG/PNG截图并保存到Android手机的SDCard目录的主要内容,如果未能解决你的问题,请参考以下文章

mac如何截屏并保存

如何在 selenium 中截取屏幕截图并粘贴为 HTML 页面?

vc 截取屏幕

有没有很好的例子说明如何在 selenium webdriver C# 中截取屏幕截图,然后裁剪并保存图像?

Python+selenium之截图图片并保存截取的图片

如何使用 php 截取已加载网页的屏幕截图? [复制]