- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 Facebook Conceal 库加密和解密图像。这是我第一次使用它,因此如果它微不足道,请多多包涵。我查看了关于 SO 的其他问题以找出我的异常的原因,我无法让它工作。
这是我到目前为止所做的......
集成:我正在使用 Eclipse,因此从 here 下载了 crypto.jar 和 libs.zip。并将 jar 文件添加到 libs 文件夹,将 .so 文件添加到 libs 文件夹内的相应文件夹。
我的场景:
我必须从相机捕捉图像,加密并将其存储在我的手机内存中。解密它并在 ImageView 中显示它。在后期,我还需要从内存中解密这张图片并通过网络发送。
所以,我的代码如下...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (Const.DEBUGGING) {
Log.d(Const.DEBUG, "RequestCode: " + requestCode + "\nResultCode:"
+ resultCode);
}
int tag = getRecordCount();
tag++;
if (requestCode == KTP_PICTURE_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
ENCRYPTEDFILENAME = tag + "_" + KTP_TAG + ".png";
saveFile((Bitmap) data.getExtras().get("data"), requestCode);
Bitmap decryptedImage = decodeFile(ENCRYPTEDFILENAME);
mImgBtnKtppicture.setImageBitmap(decryptedImage);
} else if (resultCode == RESULT_CANCELED) {
if (Const.DEBUGGING)
Log.d(Const.DEBUG, "KTP_RESULT CANCELED");
} else {
}
}
if (requestCode == PROFILE_PICTURE_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
ENCRYPTEDFILENAME = tag + "_" + PROFILE_TAG + ".png";
saveFile((Bitmap) data.getExtras().get("data"), requestCode);
Bitmap decryptedImage = decodeFile(ENCRYPTEDFILENAME);
mImgBtnPicture.setImageBitmap(decryptedImage);
} else if (resultCode == RESULT_CANCELED) {
if (Const.DEBUGGING)
Log.d(Const.DEBUG, "PICTURE_RESULT CANCELED");
} else {
}
}
}
保存文件():
public void saveFile(Bitmap photo, int code) {
try {
ContextWrapper cw = new ContextWrapper(getApplicationContext());
File directory = cw.getDir(DIRECTORY, Context.MODE_PRIVATE);
File mypath = new File(directory, ENCRYPTEDFILENAME);
if (code == KTP_PICTURE_REQUEST_CODE) {
mKtppicture = Uri.fromFile(mypath).toString();
if (Const.DEBUGGING)
Log.d(Const.DEBUG, "KTP Picture Path: " + mKtppicture);
} else if (code == PROFILE_PICTURE_REQUEST_CODE) {
mPicture = Uri.fromFile(mypath).toString();
if (Const.DEBUGGING)
Log.d(Const.DEBUG, "Profile Picture Path: " + mPicture);
}
Crypto crypto = new Crypto(
new SharedPrefsBackedKeyChain(this),
new SystemNativeCryptoLibrary());
if (!crypto.isAvailable()) {
return;
}
OutputStream fileStream = new BufferedOutputStream(
new FileOutputStream(mypath));
OutputStream outputStream = crypto.getCipherOutputStream(
fileStream, new Entity("Password"));
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.write(bitmapToBytes(photo));
objectOutputStream.close(); //Line with exception
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
位图转换字节数():
private byte[] bitmapToBytes(Bitmap photo) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
return byteArray;
}
解码文件():
private Bitmap decodeFile(String filename) {
Crypto crypto = new Crypto(
new SharedPrefsBackedKeyChain(this),
new SystemNativeCryptoLibrary());
ContextWrapper cw = new ContextWrapper(getApplicationContext());
File directory = cw.getDir(DIRECTORY, Context.MODE_PRIVATE);
File file = new File(directory, filename);
try{
FileInputStream fileStream = new FileInputStream(file);
InputStream inputStream = crypto.getCipherInputStream(
fileStream,
new Entity("Password"));
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
Bitmap bitmap = bytesToBitmap((byte[])objectInputStream.readObject());
return bitmap;
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
bytesToBitmap():
private Bitmap bytesToBitmap(byte[] bytes) {
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
return bitmap;
}
当我尝试保存图像时,在 saveFile() 中的 objectOutputStream.close();
处出现 UnsupportedOperationException
Logcat 跟踪:
10-01 16:55:34.529: W/System.err(31291): java.lang.UnsupportedOperationException
10-01 16:55:34.529: W/System.err(31291): at com.facebook.crypto.streams.NativeGCMCipherOutputStream.write(NativeGCMCipherOutputStream.java:93)
10-01 16:55:34.529: W/System.err(31291): at java.io.DataOutputStream.writeByte(DataOutputStream.java:144)
10-01 16:55:34.529: W/System.err(31291): at java.io.ObjectOutputStream.drain(ObjectOutputStream.java:394)
10-01 16:55:34.529: W/System.err(31291): at java.io.ObjectOutputStream.flush(ObjectOutputStream.java:461)
10-01 16:55:34.529: W/System.err(31291): at java.io.ObjectOutputStream.close(ObjectOutputStream.java:337)
10-01 16:55:34.529: W/System.err(31291): at com.xx.xxx.RegistrationActivity.saveFile(RegistrationActivity.java:761)
10-01 16:55:34.529: W/System.err(31291): at com.xx.xxx.RegistrationActivity.onActivityResult(RegistrationActivity.java:639)
10-01 16:55:34.529: W/System.err(31291): at android.app.Activity.dispatchActivityResult(Activity.java:5423)
10-01 16:55:34.529: W/System.err(31291): at android.app.ActivityThread.deliverResults(ActivityThread.java:3347)
10-01 16:55:34.529: W/System.err(31291): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3394)
10-01 16:55:34.529: W/System.err(31291): at android.app.ActivityThread.access$1300(ActivityThread.java:135)
10-01 16:55:34.529: W/System.err(31291): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
10-01 16:55:34.529: W/System.err(31291): at android.os.Handler.dispatchMessage(Handler.java:102)
10-01 16:55:34.529: W/System.err(31291): at android.os.Looper.loop(Looper.java:136)
10-01 16:55:34.529: W/System.err(31291): at android.app.ActivityThread.main(ActivityThread.java:5001)
10-01 16:55:34.529: W/System.err(31291): at java.lang.reflect.Method.invokeNative(Native Method)
10-01 16:55:34.529: W/System.err(31291): at java.lang.reflect.Method.invoke(Method.java:515)
10-01 16:55:34.529: W/System.err(31291): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
10-01 16:55:34.529: W/System.err(31291): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
10-01 16:55:34.529: W/System.err(31291): at dalvik.system.NativeStart.main(Native Method)
10-01 16:55:34.529: W/System.err(31291): java.io.IOException: Unexpected crypto version -1
10-01 16:55:34.529: W/System.err(31291): at com.facebook.crypto.util.Assertions.checkArgumentForIO(Assertions.java:29)
10-01 16:55:34.539: W/System.err(31291): at com.facebook.crypto.CipherHelper.getCipherInputStream(CipherHelper.java:52)
10-01 16:55:34.539: W/System.err(31291): at com.facebook.crypto.Crypto.getCipherInputStream(Crypto.java:83)
10-01 16:55:34.539: W/System.err(31291): at com.xx.xxx.RegistrationActivity.decodeFile(RegistrationActivity.java:821)
10-01 16:55:34.539: W/System.err(31291): at com.xx.xxx.RegistrationActivity.onActivityResult(RegistrationActivity.java:640)
10-01 16:55:34.539: W/System.err(31291): at android.app.Activity.dispatchActivityResult(Activity.java:5423)
10-01 16:55:34.539: W/System.err(31291): at android.app.ActivityThread.deliverResults(ActivityThread.java:3347)
10-01 16:55:34.539: W/System.err(31291): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3394)
10-01 16:55:34.539: W/System.err(31291): at android.app.ActivityThread.access$1300(ActivityThread.java:135)
10-01 16:55:34.539: W/System.err(31291): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
10-01 16:55:34.539: W/System.err(31291): at android.os.Handler.dispatchMessage(Handler.java:102)
10-01 16:55:34.539: W/System.err(31291): at android.os.Looper.loop(Looper.java:136)
10-01 16:55:34.539: W/System.err(31291): at android.app.ActivityThread.main(ActivityThread.java:5001)
10-01 16:55:34.539: W/System.err(31291): at java.lang.reflect.Method.invokeNative(Native Method)
10-01 16:55:34.539: W/System.err(31291): at java.lang.reflect.Method.invoke(Method.java:515)
10-01 16:55:34.539: W/System.err(31291): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
10-01 16:55:34.549: W/System.err(31291): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
10-01 16:55:34.549: W/System.err(31291): at dalvik.system.NativeStart.main(Native Method)
10-01 16:55:34.549: D/BAT(31291): onResume called
感谢您的帮助...
最佳答案
这是我解决问题的方法。现在加密和解密工作正常。
// Encrypts the image and saves to directory
public void encodeAndSaveFile(Bitmap photo, int code) {
try {
ContextWrapper cw = new ContextWrapper(getApplicationContext());
File directory = cw.getDir(DIRECTORY, Context.MODE_PRIVATE);
File mypath = new File(directory, ENCRYPTEDFILENAME);
Crypto crypto = new Crypto(new SharedPrefsBackedKeyChain(this),
new SystemNativeCryptoLibrary());
if (!crypto.isAvailable()) {
return;
}
OutputStream fileStream = new BufferedOutputStream(
new FileOutputStream(mypath));
OutputStream outputStream = crypto.getCipherOutputStream(
fileStream, new Entity("Password"));
outputStream.write(bitmapToBytes(photo));
outputStream.close();
} catch (UnsupportedOperationException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// convert Bitmap to bytes
private byte[] bitmapToBytes(Bitmap photo) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
return byteArray;
}
// convert bytes to Bitmap
private Bitmap bytesToBitmap(byte[] bytes) {
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
return bitmap;
}
// decode encrypted file and returns Bitmap
private Bitmap decodeFile(String filename) {
Crypto crypto = new Crypto(new SharedPrefsBackedKeyChain(this),
new SystemNativeCryptoLibrary());
ContextWrapper cw = new ContextWrapper(getApplicationContext());
File directory = cw.getDir(DIRECTORY, Context.MODE_PRIVATE);
File file = new File(directory, filename);
try {
FileInputStream fileStream = new FileInputStream(file);
InputStream inputStream = crypto.getCipherInputStream(fileStream,
new Entity("Password"));
ByteArrayOutputStream out = new ByteArrayOutputStream();
int read;
byte[] buffer = new byte[1024];
while ((read = inputStream.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
inputStream.close();
Bitmap bitmap = bytesToBitmap(out.toByteArray());
return bitmap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
这是我从相机返回后在 onActivityResult() 中调用 encodeAndSaveFile() 和 decodeFile() 的方式。
encodeAndSaveFile((Bitmap) data.getExtras().get("data"),
requestCode);
Bitmap decryptedImage = decodeFile(ENCRYPTEDFILENAME);
关于android - Facebook Conceal - 图片加密解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26140389/
我为我们的业务创建了一个 Facebook 页面,我创建了一个 Facebook 应用程序来获取 AppID,以便在 Facebook 插件中使用它。 我注意到 Facebook 应用程序的页面看起来
是否有可能知道哪个 Facebook 用户点击了我的应用用户在 Facebook 上分享的链接? 为了清楚起见,让我改写一下:我想知道我的应用用户的哪些 friend 点击了他的共享链接。 感谢任何提
我正在浏览 facebook pixel,对 facebook pixel 如何知道哪个转化来自哪个 facebook 广告感到很困惑? 假设我有这个 url http://example.com安装
我正在开发 sucsongmoi.net(越南语),当浏览者从他们的墙上分享网站链接时,一些链接 facebook 获得描述和图像,一些链接 facebook 无法获得描述和图像。 例如:分享 suc
一位同事错误地设置了个人 Facebook 页面;它应该是一个企业 Facebook 页面。 个人页面上有几个 friend 需要重定向到正确的 Facebook 业务页面。 我可以将用户从错误的个人
在 Facebook 上,当您转到“编辑我的个人资料”>“艺术和娱乐”时,会有一个“电影”自动完成小部件,它会在您输入电影时推荐电影。 因此,如果您输入“Jones”,它将开始建议: 印第安纳琼斯 布
我在我的网页上使用 Facebook 登录。首次登录时,Facebook 登录应用程序会请求获取用户数据的权限。 有什么方法可以改善这个问题,以请求喜欢我的 Facebook 页面的许可?用户点击后,
我需要知道是否可以将现有的 Facebook 页面(类别:应用程序页面)链接到 Facebook 应用程序?当我进入 Facebook 应用程序设置时,他们建议创建一个新页面。但我需要的只是链接到现有
我的网站应用程序具有通过 Facebook 登录进行登录的功能。为此,我的应用程序出现在 Facebook 上。使用 Facebook 登录工作正常。 但应用程序具有将 Facebook 帐户链接和取
我正在制作一个应用程序,让人们可以在 Facebook 上与特定的 friend 分享内容。示例:Alice 使用我的应用程序,她与 Bob 分享了一篇文章,Bob 是她的 Facebook 好友。现
我正在按照列出的说明进行操作 http://docs.appcelerator.com/platform/latest/#!/api/Modules.Facebook 并查看 Arrow 示例目录中的
假设我有一个餐厅的商业网站,一位顾客为一大群人预订了一张 table 。有没有一种方法可以让客户有机会在餐厅网站上创建 Facebook 事件,作为预订流程的一部分。我知道客户必须以某种方式从餐厅网站
我想让我的用户将他们的用户帐户与 Facebook 或 Twitter 相关联,并允许他们使用他们的 Facebook/Twitter 帐户登录我的服务器,而不是使用传统的用户名/密码。与StackO
我们有一个面子书页面。我们添加了一个自定义 FBML 选项卡。现在我们要添加评论面子书插件。我尝试添加一个脚本,我从 Face book Social Plug in .代码是 之后我将此脚本放入自
大家好 请帮我找到关于以下的官方信息: 1) 什么是“FaceBook 登录” 2) 什么是“FaceBook Connect” 谢谢 最佳答案 你可以在那里找到你需要的一切: http://deve
这是最奇怪的事情。我有非常简单的 CF 代码,查看 cgi.HTTP_REFERER。简单地说,它查看推荐人。如果链接是从我们的主要网站域之外单击的,它会显示一些内容。否则,什么也不会发生。所以,如果
我还是 Facebook Graph API 的新手,正在尝试开始使用 Facebook 地点搜索。 (按位置搜索地点) https://graph.facebook.com/search?type=
我不想开设 Facebook 帐户,但我被要求为需要使用 Facebook API 的应用程序开发功能。有没有一种方法可以开发这些功能并使用 Facebook API,而无需开设个人 Facebook
我已经按照指示实现了 DotNetOpenAuth 提供的示例应用程序 here . 正如您在下面看到的,这要求用户安装此 facebook 应用程序。 我只是想让用户使用他们的 Facebook 登
我的主页上有标准的 Facebook 登录按钮,我不希望人们仅在用户单击登录按钮时使用他们的 Facebook 帐户自动登录我的网站。 如果用户未登录 Facebook,将出现一个弹出窗口询问他的凭据
我是一名优秀的程序员,十分优秀!