Android 加密图像后无法将图像从gallery移动到SD卡
我正在尝试加密图库中的图像并将其存储在SD卡上 当我试图将图像从gallery移动到SD卡时,我收到一个“强制关闭”错误,logcat没有显示异常 我得到一个祝酒词说“图像成功加密”,但它不是移动图像从画廊到SD卡 我做错了什么Android 加密图像后无法将图像从gallery移动到SD卡,android,encryption,Android,Encryption,我正在尝试加密图库中的图像并将其存储在SD卡上 当我试图将图像从gallery移动到SD卡时,我收到一个“强制关闭”错误,logcat没有显示异常 我得到一个祝酒词说“图像成功加密”,但它不是移动图像从画廊到SD卡 我做错了什么 private void encript(byte[] data, byte[] clear) { byte[] keyBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0
private void encript(byte[] data, byte[] clear) {
byte[] keyBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 };
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = null;
try {
cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
}
try {
cipher.init(Cipher.ENCRYPT_MODE, key);
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] cipherText = new byte[cipher.getOutputSize(data.length)];
// int ctLength = cipher.update(data, 0, data.length, cipherText, 0);
byte[] input = null;
try {
input = cipher.doFinal(cipherText);
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try{
if(input.length>0){
Toast.makeText(getApplicationContext(), "Image successfully encripted", 3000).show();
}
ByteArrayInputStream bis = new ByteArrayInputStream(input);
ObjectInputStream ois = new ObjectInputStream(bis);
File encriptedfile = (File) ois.readObject();//This is the file which i want to Move to App folder
bis.close();
ois.close();
} catch (StreamCorruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return;
}
//Code for copy image into app folder......
File outputFolder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + ".map");
try {
FileUtils.copyFile (encriptedfile, outputFolder);
}
catch (IOException e) {
Log.e("photomover", e.toString());
}
}
08-17 11:42:00.905:WARN/System.err(8453):java.io.StreamCorruptedException
08-17 11:42:00.905:WARN/System.err(8453):位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2392)
08-17 11:42:00.905:WARN/System.err(8453):位于java.io.ObjectInputStream。(ObjectInputStream.java:445)
08-17 11:42:00.905:WARN/System.err(8453):位于com.cw.GalleryShareimage1Activity.enccript(GalleryShareimage1Activity.java:177)
08-17 11:42:00.905:WARN/System.err(8453):位于com.cw.GalleryShareimage1Activity.onCreate(GalleryShareimage1Activity.java:76)
08-17 11:42:00.915:WARN/System.err(8453):位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-17 11:42:00.915:WARN/System.err(8453):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2633)
08-17 11:42:00.915:WARN/System.err(8453):位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685)
08-17 11:42:00.915:WARN/System.err(8453):在android.app.ActivityThread.access$2300(ActivityThread.java:126)
08-17 11:42:00.915:WARN/System.err(8453):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:2038)
08-17 11:42:00.915:WARN/System.err(8453):位于android.os.Handler.dispatchMessage(Handler.java:99)
08-17 11:42:00.915:WARN/System.err(8453):位于android.os.Looper.loop(Looper.java:123)
08-17 11:42:00.915:WARN/System.err(8453):位于android.app.ActivityThread.main(ActivityThread.java:4633)
08-17 11:42:00.915:WARN/System.err(8453):位于java.lang.reflect.Method.invokenactive(本机方法)
08-17 11:42:00.915:WARN/System.err(8453):位于java.lang.reflect.Method.invoke(Method.java:521)
08-17 11:42:00.915:WARN/System.err(8453):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
08-17 11:42:00.915:WARN/System.err(8453):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-17 11:42:00.915:WARN/System.err(8453):在dalvik.System.NativeStart.main(本机方法)
08-17 11:42:00.925:WARN/dalvikvm(8453):threadid=1:线程退出时出现未捕获异常(组=0x400207d8)
08-17 11:42:00.935:错误/AndroidRuntime(8453):致命异常:主
08-17 11:42:00.935:错误/AndroidRuntime(8453):java.lang.RuntimeException:无法启动活动组件信息{com.cw/com.cw.GalleryShareImage1AActivity}:java.lang.NullPointerException:源不能为空
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在android.app.ActivityThread.access$2300(ActivityThread.java:126)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:2038)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在android.os.Handler.dispatchMessage(Handler.java:99)上
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在android.os.Looper.loop(Looper.java:123)上
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在android.app.ActivityThread.main(ActivityThread.java:4633)上
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):位于java.lang.reflect.Method.invokenactive(本机方法)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):位于java.lang.reflect.Method.invoke(Method.java:521)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在dalvik.system.NativeStart.main(本机方法)
08-17 11:42:00.935:错误/AndroidRuntime(8453):原因:java.lang.NullPointerException:源不能为null
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):位于org.apache.commons.io.FileUtils.copyFile(FileUtils.java:1068)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):位于org.apache.commons.io.FileUtils.copyFile(FileUtils.java:1038)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):位于com.cw.GalleryShareimage1Activity.onCreate(GalleryShareimage1Activity.java:96)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2633)
08-17 11:42:00.935:错误/AndroidRuntime(8453):。。。还有11个
您的代码有几个缺陷:
首先,加密数据时,您没有正确处理要加密的数据。您应该这样尝试:
byte[] cipherText = cipher.doFinal(data);
其次,您使用的是ObjectInputStream
,它是readObject()
方法。ObjectInputStream仅对通过Java序列化创建的数据有用。您不能以这种方式处理图像。将其强制转换到文件
也没有任何意义
由于您在RAM中执行所有操作(顺便说一句,由于android上的RAM限制,这对大文件不起作用),因此您只需将加密的内存数据保存到文件中。无需移动:
File outputFolder = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),".map");
File outputFile = new File(outputFolder, "outputfilename.bin");
FileOutputStream out = new FileOutputStream(outputFile);
out.write(cipherText);
out.close;
仔细检查代码,看看发生了什么。看看哪里失败了。张贴日志也会有帮助。(即使你说它没有显示异常)通过获取加密文件名,我可以将图像复制到应用程序文件夹中,但我无法
File outputFolder = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),".map");
File outputFile = new File(outputFolder, "outputfilename.bin");
FileOutputStream out = new FileOutputStream(outputFile);
out.write(cipherText);
out.close;