Java 在应用程序和服务之间共享非包裹物品
我正在寻找一种方法来共享我的应用程序和当前服务中的非包裹物品。情况就是这样: 我有一个服务来存储来自相机应用程序、照片、视频等的所有媒体数据。该服务的任务是在用户进入后台时继续保存媒体。当我第一次这样做时,我有很多SIGSEGV错误:Java 在应用程序和服务之间共享非包裹物品,java,android,service,android-camera,android-camera2,Java,Android,Service,Android Camera,Android Camera2,我正在寻找一种方法来共享我的应用程序和当前服务中的非包裹物品。情况就是这样: 我有一个服务来存储来自相机应用程序、照片、视频等的所有媒体数据。该服务的任务是在用户进入后台时继续保存媒体。当我第一次这样做时,我有很多SIGSEGV错误: 08-22 10:15:49.377 15784-15818/com.bq.camerabq A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x8c3f4000 in tid 15818 (Camera
08-22 10:15:49.377 15784-15818/com.bq.camerabq A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x8c3f4000 in tid 15818 (CameraModuleBac)
这是因为我从ImageReader恢复的图像项不可打包,我修复了这个问题,从图像中保存Bytebuffers,而不是整个图像项
但是,现在我遇到了与DNG捕获相同的问题,因为我从imageReader获得了一个CaptureResult项,我需要使用它创建一个DngCreator
项来写入DNG图像
CaptureResults和DNGCreator不是可打包的或可序列化的,因此如果我在后台,我找不到从应用程序保存数据以在服务中恢复数据的方法
我试图在调用服务时复制引用,但没有成功。另外,我在其他帖子中看到,我可以在应用程序上下文中的静态引用中保存该项,以便能够在不同的活动中恢复它。所以最后我试了一下:
public class DngManager extends Application {
public static DngManager sDngManagerInstance;
protected Hashtable<String, CaptureResult> dngCaptureResults;
private static String DNG_KEY_PREFIX = "dngResult_";
public DngManager(){
super();
createDNGCaptureResults();
}
public void createDNGCaptureResults() {
dngCaptureResults = new Hashtable<String, CaptureResult>();
}
public boolean addDNGCaptureResultToSharedMem(long dateKey, CaptureResult value) {
dngCaptureResults.put(DNG_KEY_PREFIX + dateKey, value);
return true;
}
public CaptureResult getFromDNGCaptureResults(long dateKey) {
return dngCaptureResults.get(DNG_KEY_PREFIX + dateKey);
}
private boolean containsDNGCaptureResults(long dateKey) {
return dngCaptureResults.containsKey(DNG_KEY_PREFIX + dateKey);
}
public void clearDNGCaptureResults(long dateKey) {
String partKey = String.valueOf(dateKey);
Enumeration<String> e2 = dngCaptureResults.keys();
while (e2.hasMoreElements()) {
String i = (String) e2.nextElement();
if (i.contains(partKey))
dngCaptureResults.remove(i);
}
}
public static DngManager getInstance(){
if (sDngManagerInstance == null){
sDngManagerInstance = new DngManager();
}
return sDngManagerInstance;
}
}
不管怎么说,它还是给了我一个SIGSEGV错误。我还能试什么
CaptureResult dngResult = ((DngManager)getApplication()).getFromDNGCaptureResults(mDngPicture.getDateTaken());
if (dngResult == null) {
return;
}
DngCreator dngCreator = new DngCreator(mCameraCharacteristics, dngResult);
path = Storage.generateFilepath(title, "dng");
file = new File(Uri.decode(path));
try {
Log.e(TAG, "[DngSaveTask|run] WriteByteBuffer: Height " + mDngPicture.getSize().getHeight() + " Width " + mDngPicture.getSize().getWidth());
OutputStream os = new FileOutputStream(file);
dngCreator.writeByteBuffer(os, mDngPicture.getSize(), mDngPicture.getDngByteBuffer(), 0);
} catch (IOException e) {
Log.d(TAG, "[DngSaveTask|run] " + e);
e.printStackTrace();
}
dngCreator.close();
Log.e(TAG, "[DngSaveTask|run] Cleaning Result from shared memory");
DngManager.getInstance().clearDNGCaptureResults(mDngPicture.getDateTaken());
MediaScannerConnection.scanFile(getApplicationContext(), new String[]{file.getAbsolutePath()}, null, null);