背景:我正在为一个信使程序编写一个相机应用程序.我无法随时将捕获的图像保存到永久磁盘.相机必须支持所有方向.我的实现是熟悉的Surfaceview示例.我使用Display类来检测方向并相应地旋转相机.在takePicture jpeg回调中,我从byte []构造一个位图,以解决我遇到的一些宽高比问题:Camera API:跨设备问题
问题描述:在某些设备上,在ROTATION_270处拍摄的构造的位图(设备顺时针旋转90度)是颠倒的.到目前为止,似乎是三星.我只能假设相机可能是通过其他方式焊接或者是那种影响,但这既不是在这里也不是在那里.虽然我可以检查Bitmap是否是横向的,但我无法从逻辑上检查它是否是尺寸颠倒所以我需要访问EXIF数据.
Android提供了一个解析器这个http://developer.android.com/reference/android/media/ExifInterface.html但不幸的是它具有接受文件的单一构造......我没有,不想.直观地说,我可以为一个字节数组编写一个构造函数,但考虑到它们调用本机代码,这看起来真的很痛苦http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2 .1_r1 /安卓/媒体/ ExifInterface.java
我的问题有两个部分:
有没有人知道byte []数组是否包含完整的EXIF jpeg头数据,或者是通过BitmapFactory.decode(...)/ BitmapFactory.compress(...)的路径以某种方式添加?
如果此EXIF数据在字节数组中退出,我如何以可靠的方式解析方向信息?
编辑10/18/12
下面的pcans回答涉及我的问题的第2部分.正如我在下面的评论中指出的那样,如果你想使用该解析器,你必须将源代码合并到你的项目中.链接SO帖子中提到的更改已经在此处进行了转发:https://github.com/strangecargo/metadata-extractor
注意元数据提取器的更新版本可直接在Android上运行而无需修改,可通过Maven获得.
但是,至于第1部分,当我使用从takePicture获得的字节数组运行时,我从解析器返回0个标签.我开始担心字节数组没有我需要的数据.我将继续研究这一点,但欢迎任何进一步的见解.
我正在开发一个相机应用程序,基本上作为消息应用程序的一部分来附加图像等.该应用程序需要工作> = SDK 2.2和:
我不能像我喜欢的那样使用默认的Android相机,因为:
该应用程序的性质决定了图像不应该保存到磁盘,一些OEM(三星)喜欢这样做而不给你一个选择.
我无法调用任何其他相机应用程序可以拦截的意图,因为那时该应用程序可以保存图像.
我目前的问题是处理Android相机显然不喜欢纵向的事实.具体来说,经过一些挖掘后,我正在监控显示屏,并在轮换时调用setDisplayOrientation(90).这可以工作,但是surfaceview维度也需要更改,这必须在支持的维度内完成,否则参数设置会使应用程序崩溃.
我正在使用我在这里找到的另一个SO片段(getBestPreviewSize()方法)这样做,但它有一个明显的问题,我无法相信我没有找到其他人.
该部分takePicture的生命周期涉及调用PostView图片回调.这将显示当前暂停SurfaceView图像的静止图像,该图像将通过byteArray返回到原始和/或jpeg回调.我的问题是,这个图像在一些看似随机的测试设备上仍然存在偏差!因此,行为是用户以完美的4:3宽高比看到动态相机图像,直到他们拍摄照片并且他们呈现的图像被压扁.请注意,字节数组本身是正确的,当我Bitmap在消息传递端点构造它时,它显示正常,但这仍然是一个问题.
此时我无法看到如何改变静止图像显示.谁能帮我这个?
我有一个非常令人困惑的问题.我已经构建了我的应用程序的最终版本APK,将其提交到Play商店,并安装在我的测试设备上.当我以这种方式安装时,应用程序展示了不同的启动模式行为.
我生成的APK是Gradle版本的产品,包括Proguard和zipalign.为了便于解释,请说我的应用程序是一个仪表板类型的应用程序,其主要活动显示活动B的启动按钮.我拿这个版本APK并通过USB'adb install'将其安装到我的设备所以我正在比较完全相同的APK有两种不同的安装方法.
USB方法: 当用户单击主活动中的按钮以启动活动B时,将启动活动B并在屏幕上显示.如果用户点击主页按钮(接到电话等)然后返回应用程序,活动B仍然显示.这是期望的(AND EXPECTED)行为.
存储方法: 从商店下载APK并再次安装/启动显示主要活动.单击该按钮时,将再次启动活动B. 现在,当用户回到主页并返回时,后面的堆栈显然被清除,主活动再次显示.
我没有在清单中指定任何特殊的启动模式,因此所有活动都是标准的.怎么安装方法会影响这样的事情!?这让我很生气.有没有人知道为什么会这样?
我最近一直在努力熟悉Linux网络堆栈和设备驱动程序(两者都有类似名称的O'Reilly书籍),最终目标是卸载UDP.我已经在网卡上实现了UDP,但现在很难实现......
我没有在这个更大的目标上寻求帮助,而是希望有人可以为我澄清一个特定的片段,我发现它是LKM的一部分,它注册了一个新的协议(OTP),充当设备驱动程序和网络堆栈之间的过滤器.
(注意:这篇Phrack文章包含三个不同的模块,OTP的代码位于页面底部)
在他的例子的init函数中,他有:
otp_proto.type = htons(ETH_P_ALL);
otp_proto.func = otp_func;
dev_add_pack(&otp_proto);
Run Code Online (Sandbox Code Playgroud)
哪个(如果我理解正确的话)应该将otp_proto注册为数据包嗅探器并将其放入ptype_all数据结构中.我的问题是关于dev_add_pack.
注册为过滤器的协议是否总是放在L2和设备驱动程序之间的这一层?或者,例如,我可以使用相同的过程在应用程序层和传输层之间进行这样的过滤(分析套接字参数)吗?
如果这令人困惑,我很抱歉 - 当涉及到改变内核堆栈功能的模块时,我在绕着更大的图片时遇到了一些麻烦.
谢谢
我编写了一个简单的模板化Matrix类,用于操作数据基质的主应用程序.截断的Matrix代码是:
template <typename T>
class Matrix{
private:
std::vector<T> matrixRepresentation;
bool transposed;
public:
Matrix(int r, int c);
int maxRows;
int maxCols;
void setMatrixValue(int row, int col, T val);
T getMatrixValue(int row, int col);
};
template <typename T>
Matrix<T>::Matrix(int r, int c){
maxRows = r;
maxCols = c;
matrixRepresentation.resize((r+1)*(c+1));
}
template <typename T>
void Matrix<T>::setMatrixValue(int row, int col, T val){
matrixRepresentation[row + col*maxCols] = val;
}
template <typename T>
T Matrix<T>::getMatrixValue(int row, int col){
return matrixRepresentation[row + col*maxCols];
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我只是将2D矩阵表示为向量,并提供包装方法来隐藏该事实.即使我将堆栈变量matrixRepresentation调整为
(r+1)(c+1)
Run Code Online (Sandbox Code Playgroud)
我最后在代码中遇到了内存损坏问题,valgrind告诉我以下内容: …
android ×3
java ×2
apk ×1
c++ ×1
camera ×1
exif ×1
google-play ×1
jpeg ×1
linux-kernel ×1
memory-leaks ×1
module ×1
networking ×1
protocols ×1
valgrind ×1