gpt4 book ai didi

android - Android 11 上的新 BlobStoreManager 读写

转载 作者:行者123 更新时间:2023-12-05 00:03:31 29 4
gpt4 key购买 nike

我以前使用外部存储来存储我想在我的应用程序之间共享的特定数据(没有任何内容提供者“主机”)

File folder = new File(Environment.getExternalStorageDirectory(), "FOLDER_NAME");
File file = new File(folder, "FILE_NAME.dat");
FileOutputStream outputStream = new FileOutputStream(file);
这就是我尝试使用 BlobStoreManager 的原因,正如谷歌针对 30 ( https://developer.android.com/training/data-storage/shared/datasets) 的建议中所建议的那样
读取和写入基于具有 4 个参数的 BlobHandle,其中一个是基于“内容”的 MessageDigest。 BlobHandle 必须使用相同的 4 个参数,否则读取将失败 (SecurityException)。
我设法写入数据并读取它,但这没有任何意义:
看来,为了写,我需要使用我要写的数据来生成BlobHandle。
然后,要读取,由于 BlobHandle 必须使用相同的 4 个参数,我还需要我写入的数据能够读取。
完全不合逻辑,因为我想读取这些数据,我没有它!
我必须错过一些东西,或者只是不明白它是如何工作的。如果有人可以帮助:)
这是我的样本:
如果我设置以下内容:
  • createBlobHandle: 内容 = "我的数据"
  • 写:数据=“我的数据”
  • 然后写入会成功,读取也会成功。但是在普通用例中读取它之前我不知道该值:(

  • 如果我设置以下内容(这将是逻辑,至少对我而言):
  • createBlobHandle: content = "somekey"
  • 写:数据=“我的数据”
  • 然后写入将失败:(
  • @RequiresApi(api = Build.VERSION_CODES.R)
    private BlobHandle createBlobHandle() {
    //Transfer object
    String content = "SomeContentToWrite";
    String label = "label123";
    String tag = "test";

    //Sha256 summary of the transmission object
    try {
    byte[] contentByte = content.getBytes("utf-8");

    MessageDigest md = MessageDigest.getInstance("sha256");
    byte[] contentHash = md.digest(contentByte);

    return BlobHandle.createWithSha256(contentHash, label,0, tag);
    } catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
    return null;
    }

    private void write() {
    String data = "SomeContentToWrite";
    @SuppressLint("WrongConstant") final BlobStoreManager blobStoreManager = ((BlobStoreManager) applicationContext.getSystemService(Context.BLOB_STORE_SERVICE));

    //Generate the session of this operation
    try {
    BlobHandle blobHandle = createBlobHandle();
    if (blobHandle == null)
    return;
    long sessionId = blobStoreManager.createSession(blobHandle);
    try (BlobStoreManager.Session session = blobStoreManager.openSession(sessionId)) {
    try (OutputStream pfd = new ParcelFileDescriptor.AutoCloseOutputStream(session.openWrite(0, data.getBytes().length))) {
    //The abstract of the written object must be consistent with the above, otherwise it will report SecurityException
    Log.d(TAG, "writeFile: >>>>>>>>>>text = " + data);
    pfd.write(data.getBytes());
    pfd.flush();

    //Allow public access
    session.allowPublicAccess();
    session.commit(applicationContext.getMainExecutor(), new Consumer<Integer>() {
    @Override
    public void accept(Integer integer) {
    //0 success 1 failure
    Log.d(TAG, "accept: >>>>>>>>" + integer);
    }
    });
    }
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    private String read() {
    String data = "";
    @SuppressLint("WrongConstant") final BlobStoreManager blobStoreManager = ((BlobStoreManager) applicationContext.getSystemService(Context.BLOB_STORE_SERVICE));

    BlobHandle blobHandle = createBlobHandle();
    if (blobHandle != null) {
    try (InputStream pfd = new ParcelFileDescriptor.AutoCloseInputStream(blobStoreManager.openBlob(createBlobHandle()))) {
    //Read data
    byte[] buffer = new byte[pfd.available()];
    pfd.read(buffer);
    String text = new String(buffer, Charset.forName("UTF-8"));
    Log.d(TAG, "readFile: >>>>>>>>>>>>>>>>>>>>" + text);
    } catch (IOException e) {
    e.printStackTrace();
    } catch (SecurityException e) {
    e.printStackTrace();
    }
    }
    return data;
    }

    最佳答案

    根据official training documentation在问题中链接,在提出问题时缺少的信息是 BlobHandler 中包含的四条数据需要上传到客户端应用程序拥有的服务器然后随后由哪个其他应用程序想要通过 BlobStorageManager 访问 blob 下载.
    因此,似乎不支持设备上的 blob 发现。也有可能使用 Content Provider 的解决方案它可以提供四个所需的数据,从而避免了对服务器基础架构的需求。
    enter image description here

    关于android - Android 11 上的新 BlobStoreManager 读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66250094/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com