微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何向 Android DocumentProvider 添加应用特定权限

如何解决如何向 Android DocumentProvider 添加应用特定权限

我想在 AppA 中创建一个文件,然后只能从 AppB 访问它。我可以通过 DocumentProvider 创建文件,然后通过 StorageClient 访问它,参见示例 here。如何设置 AppA 中文件的权限,以便只有 AppB 可以访问它?

AppA中创建文件方法

        String s = "kv;ab\nkv1;cd";
        try {
            byte[] buffer = s.getBytes();
            String filename = "myfile.txt";
            System.out.println("filename="+filename);
            FileOutputStream fos = getContext().openFileOutput(filename,Context.MODE_PRIVATE);
            fos.write(buffer);
            fos.close();
            System.out.println(s);
        } catch (IOException e) {
            e.printstacktrace();
        }
    }   

AppB 中文件访问的方法

public void onClick(View view) {
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("text/plain");
        Uri pickerInitialUri= Uri.parse("content://com.example.android.storageprovider.documents/document/root%3Amyfile.txt");
        intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI,pickerInitialUri);
        startActivityForResult(intent,READ_REQUEST_CODE);
    }

    @Override
    public void onActivityResult(int requestCode,int resultCode,Intent resultData) {
        super.onActivityResult(requestCode,resultCode,resultData);
        readFileExternalStorage();
    }

    public String readFileExternalStorage() {
        String s = "";
        Uri uri1 = Uri.parse("content://com.example.android.storageprovider.documents/document/root%3Amyfile.txt");
        try {
            InputStream ins = this.getBaseContext().getContentResolver().openInputStream(uri1);
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            int size;
            byte[] buffer = new byte[1024];
            while ((size = ins.read(buffer,1024)) >= 0) {
                outputStream.write(buffer,size);
            }
            ins.close();
            buffer = outputStream.toByteArray();
            s = new String(buffer);
            System.out.println("output=" + s);
        } catch (FileNotFoundException e) {
            System.out.println("An error occurred.");
            e.printstacktrace();
        } catch (IOException e) {
            System.out.println("An error occurred.");
            e.printstacktrace();
        }
        TextView textview = findViewById(R.id.textView);
        textview.setText(s);
        return "ok\n" + s;
    }

解决方法

两个可能的选择-

  1. https://developer.android.com/guide/topics/permissions/defining

  2. 使用共享加密密钥和基于用户的 salt 来加密和解密 Android 上存储的文件

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。