如何才能使pdf文件仅由我的应用程序读取?

时间:2017-07-25 05:13:37

标签: android

是否可以从服务器下载PDF并以只有我的应用程序可以读取的格式保存?

4 个答案:

答案 0 :(得分:0)

Is it possible to download pdf from server.

是的,有可能。下载您的pdf并相应地加密和解密您的文件。

您可以使用CipherOuputStream和CipherInputStream尝试这样:

byte[] buf = new byte[1024];

加密:

public void encrypt(InputStream in, OutputStream out) {
    try {
        // Bytes written to out will be encrypted
        out = new CipherOutputStream(out, ecipher);

        // Read in the cleartext bytes and write to out to encrypt
        int numRead = 0;
        while ((numRead = in.read(buf)) >= 0) {
            out.write(buf, 0, numRead);
        }
        out.close();
    } catch (java.io.IOException e) {
    }
}

解密:

public void decrypt(InputStream in, OutputStream out) {
    try {
        // Bytes read from in will be decrypted
        in = new CipherInputStream(in, dcipher);

        // Read in the decrypted bytes and write the cleartext to out
        int numRead = 0;
        while ((numRead = in.read(buf)) >= 0) {
            out.write(buf, 0, numRead);
        }
        out.close();
    } catch (java.io.IOException e) {
    }
}

答案 1 :(得分:0)

如果我正确理解您的问题,您希望您的应用程序成为读取此特定PDF文件的唯一应用程序。你想知道如何确保你这样做。

由于你的要求不是正版(hacky),解决方案也必须有点hacky。

您可以下载该文件并使用您自己的自定义扩展程序存储它(例如file.mypdf)

有一个意图过滤器,支持匹配 .mypdf 文件的mimetypes

答案 2 :(得分:0)

您可以让服务器加密下载,并且您的客户端应用程序使用公钥/私钥对对其进行解密。这可以防止任何拥有窥探代理的人观察和保存您的内容,但它不会阻止最坚决的用户窃取这些文件,因为它们最终会以某种解密形式存在。要实现这一点,您可能需要创建自己的PDF查看器,并以查看者可以执行的方式损坏PDF的字节,但没有其他查看者可以恢复

答案 3 :(得分:0)

这是我在我的应用程序中使用的工作示例....希望这可以帮助您

  

是否可以从服务器下载pdf并保存

是的我已经使用改装库从服务器下载pdf文件,您可以使用 Volly Loopj AsyncTask

下载pdf文件后,您将获得文件的InputeStream对象,而不是加密并存储在应用程序私有文件夹中(因此没有其他应用程序可以使用它)

public static File encryptAndSaveFileInPrivateFolder(
            Context context, String albumName, InputStream inputStream, String fullFileName) {
        File file = null;
        try {
            // Get the directory for the app's private pictures directory.
            File fileDirectory = new File(context.getExternalFilesDir(
                    Environment.DIRECTORY_PICTURES),""+albumName);
            if (!fileDirectory.exists()) {
                fileDirectory.mkdirs();
            }

            file = new File(fileDirectory,""+fullFileName);
            if (file.exists()) {
                file.delete();
            }
            FileOutputStream output = new FileOutputStream(file);
            encrypt(inputStream,output);
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return file;
    }

此方法会加密您的文件

public static void encrypt(InputStream fis,FileOutputStream fos ) throws IOException, NoSuchAlgorithmException
            , NoSuchPaddingException, InvalidKeyException {
        // Here you read the cleartext.
        //FileInputStream fis = new FileInputStream("data/cleartext");
        // This stream write the encrypted text. This stream will be wrapped by another stream.
        // FileOutputStream fos = new FileOutputStream("data/encrypted");

        String password ="passwordProtectd";
        // Length is 16 byte
        byte[] inputByte = password.getBytes("UTF-8");
        SecretKeySpec sks = new SecretKeySpec(inputByte, "AES");
        // SecretKeySpec sks = new SecretKeySpec(password.getBytes(), "AES");
        // Create cipher
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, sks);
        // Wrap the output stream
        CipherOutputStream cos = new CipherOutputStream(fos, cipher);
        // Write bytes
        int b;
        byte[] d = new byte[8];
        while((b = fis.read(d)) != -1) {
            cos.write(d, 0, b);
        }
        // Flush and close streams.
        cos.flush();
        cos.close();
        fis.close();
    }

比使用意图显示pdf

public void decryptFileAndShow(Context context,File mFile) {
        try{
            if (null != mFile) {
                String parentPath = mFile.getAbsoluteFile().getParent();//Actual encrypted file path
                File tempFile = new File(parentPath, "report.pdf"); //Created new file that decrypted format after view we will delete this
                //tempFile =File.createTempFile("prefix","TestMyPDF.pdf", context.getExternalFilesDir(""));
                Utilities.decrypt( new FileInputStream(mFile), new FileOutputStream(tempFile));


                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setDataAndType(Uri.fromFile(tempFile), "application/pdf");
                intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                context.startActivity(intent);
                tempFile.deleteOnExit();
            }
        }catch (Exception e){
            e.printStackTrace();
        }

    }  

最后用于解密的方法

public static void decrypt(FileInputStream fis,FileOutputStream fos ) throws IOException, NoSuchAlgorithmException,
            NoSuchPaddingException, InvalidKeyException {
        // FileInputStream fis = new FileInputStream("data/encrypted");
        // FileOutputStream fos = new FileOutputStream("data/decrypted");
        String password ="passwordProtectd";
        byte[] inputByte = password.getBytes("UTF-8");
        SecretKeySpec sks = new SecretKeySpec(inputByte, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, sks);
        CipherInputStream cis = new CipherInputStream(fis, cipher);
        int b;
        byte[] d = new byte[8];
        while((b = cis.read(d)) != -1) {
            fos.write(d, 0, b);
        }
        fos.flush();
        fos.close();
        cis.close();
    }