在应用和服务

时间:2016-08-22 08:51:59

标签: 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 (CameraModuleBac)

这是因为我从imageReaders中恢复的Image项目不是parceable,我修复了这个从图像中保存Bytebuffers而不是整个图像项目。

但是,现在我遇到了与DNG捕获相同的问题,因为从我的imageReader中我得到了一个CaptureResult项目,我需要用它来创建一个DngCreator项目来编写dng图像。

CaptureResults和DngCreator不是parceables或Serializables,所以如果我在后台,我找不到从应用程序保存数据以便在服务中恢复数据的方法。

我试图在调用服务时复制引用,但它确实没有用。我还在其他帖子中看到Object Sharing Between Activities in AndroidObject Sharing Between Activities in Android我可以将项目保存在应用程序上下文中的静态引用中,以便能够在不同的活动中恢复它。所以最后我尝试了这个:

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

后来我在我的服务中恢复了它:

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

无论如何,它仍然给我一个SIGSEGV错误。所以我不知道还能尝试什么。希望有人能够帮助我!

提前非常感谢你!

0 个答案:

没有答案