>在浏览器中点击API时,它正在下载图像.该网址为http://example.com/api/v1/filedownloader.json?file=GvygDaYb64wUon0lxp2H1458543376.
>我已经更改了服务器名称,并将example.com添加到该URL.所以
它不会在浏览器中运行时下载图像文件.但是你可以
看图像文件
here.
>然后我用Encode
tool和
Decode
tool.
解码后,我得到.bin文件.然后我改成了.png
格式.只有这样才能得到确切的图像.
>我不知道如何做所有这些功能来获得图像
在imageView中显示.
>无论如何,我尝试以下代码与this:
logcat的:
03-24 04:29:43.816: E/OnResponse(15392): ÿØÿà��JFIF������������ÿí��Photoshop 3.0��8BIM����������g��9dXpsI_ORS9jWIcxWfWe(��bFBMD01000abe030000070e0000c51a0000161c0000251d0000bc2000007f350000fc370000323a00003f3c0000f4620000ÿâICC_PROFILE������lcms����mntrRGB XYZ Ü��������)��9acspAPPL����������������������������������������������������öÖ����������Ó-lcms���������������������������������������������������������������������������������������������� 03-24 04:29:43.816: E/OnResponse(15392): desc������ü������^cprt����\������wtpt����h������bkpt����|������rXYZ����������gXYZ����¤������bXYZ����¸������rTRC����Ì������@gTRC����Ì������@bTRC����Ì������@desc��������������c2��������������������������������������������������������������������������������������������������������������������������������������������������������������������text��������FB����XYZ ������������öÖ����������Ó-XYZ ����������������3����¤XYZ ������������o¢����8õ����XYZ ������������b����·����ÚXYZ ������������$��������¶Ïcurv��������������������ËÉckö?Q4!ñ)2;FQw]íkpz±|¬i¿}ÓÃé0ÿÿÿÛ��C�� 03-24 04:29:43.816: E/OnResponse(15392): "##! %*5-%'2( .?/279<<<$-BFA:F5;<9ÿÛ��C 03-24 04:29:43.816: E/OnResponse(15392): 9& &99999999999999999999999999999999999999999999999999ÿÂ��¸¸��"��ÿÄ����������������������������ÿÄ��������������������������ÿÄ��������������������������ÿÚ����������íÐÙG,!.Ph5ð8ò÷¸¥®ÐàÔ§DUdº de��kP'.¤ÅS BG ìóölâvw@+.ÆÖ®©$¸ Ø 03-24 04:29:43.816: E/OnResponse(15392): K¥Yp³ºXC¹O/)u RÉuEÊ$£³UÂP©hL^ÅÌ ·üûÌ%§ EU-1i6Ss©,ÞÌõ®{·W¹k`¤I!kwt%ÙeP¦*Ôªóï-¿ 03-24 04:29:43.816: E/OnResponse(15392): l"4áá#^-KSIBá¯S¨jYeîÌùucÓq}Lvå^ jÍ[Bz¾·í'nUï#tE ÂQ(äf)Uw(5ݨG/cUÙÀSAIÓ(´ÌÑY.,±iíÒ«Bଽ^pvf;TAX,KÄEµXbìÜHqßìx¯Wf ¬«R\¤.ªªì#IOYçx=ÿ��7+J%g(ªÉM*ÖhÙ¶ìíZMøعs^²Èó¡fº(%F¬î\ÓF¥§*ÇÈÉ+«Çu{Hë¥]G4Q%A]Eñî>±3¦Y:,tÖØ&:×F3Óf]¡9ÖõQ9Zã��ÕZ3¼9zIÖy¶ÓTÓPֺϫ@eÎv ìô}¿%ên[Tz)h6v¹n,h°°?ÅfìÓOÇZ1ЮÑCdÖJí³íÁ±ÌN·VcÔpÐèkEÃ`W°+5hg `Eçg4µãß4VzÆÏ[ã½-x7¨A`ºÊD5Wå®ky{º¬ZùöeÔÏG¶Br VD&´³· &µçY׬fLDLEP²¬X°2®æ¹\{Æ|°o{¾¦®w* Kªj2ÖåÉâ��nkv¼yöÐC3·±MÎWÆ%ÈmÞ e��æÌè*ÍsgJSWPØ+bn]@0×<¸7cßnçé³Ü߸pª(©AÕÂÖV*ϯNlë^¬:ùõÝjfz½©vuwV4nvFåf°ÒT±0&§c,³Yv#tUH\%Ø\ÚÇ6¹-úr[n}ÃêÈÊ`J¡£! t¬ªÍ£<7VMXë³Fmú¹«vwED¥pÐlÌ6k!m+[lI@2Ò¬êÂhFè© jl%\Gfß Ìäï¿>o!jJ²Ìn¡,®XJg"<ÊH!»±ô±ÔÞ¶c¦¥ÙÝÚÙ `HwW¨Â]¡Â;R´eZ¦Í.¡T`-MSs3ståS|˧ØY¢VÛ1ÌA^¶"¹Id"¹¹=,»ùÄô0o¾=©7¥ù¦u¶ò:WÚa..ÊAÙF®tXhÐåJB#)Â1bj±jhÙÍÍÒæôåV,×-^ãÃûPúuë9rj#D^®4WFªêÞ_sÇÓÈáú(?¥r2³¡'äa¥y]yÖfúRàîèGf´¦vuóñCYë³Gj¹$t& 03-24 04:29:43.816: E/OnResponse(15392): ftK4]Oc¾yØ;u^ØÎûÀ!×ÎÖZ±yVµv ÐÙËò¿/.ÃÇìr±Ó6ìÚõdÌél0MU±:æ3¤¼æµ¸é[qêÍ}´õà\ÈÚÍg³å^{0½*ÃÓÎò£¨Äàb«Óæëë/£¬Îo|½æîV{ðUµr®1É.¥Ü. ¥!ù±ÐyÝNo>ØõfÔ\ãuvc=C¨².¥H:M$º$£\é:· dt(ÓZÆP×ró¬³P-P¥µR¯ü]9wØÕóínnÿ��+£æùç pçRv¢E¢òêNw1j>]¸ë65.çլ첢² 1ì0aÝÉVrÀ¦] j¬eµpïÍeä×]9vW&;§ÑùßAßÆéɽc®|nÙ!æYbÔ£¢èLVwñïËÍÕâGUÙuã©°hC-eEg~u 03-24 04:29:43.816: E/OnResponse(15392): MnK9Û0ìW¥Îzr¥º.êVÅBrjǬKOx%³*·µÍßÛÍììòúÉrCÍBcAXrÅ1Þ;Óçã¦XuséjLS[uXïFuJf¡«²Ãôb|t3µ¶¢£(XÂÐùwË£ÒÌÖ¢#:qê^o·T��ä%gÈ`*WQlJN×EÌéx®4»õáÓÃÓ±n6f6 03-24 04:29:43.816: D/skia(15392): --- SkImageDecoder::Factory returned null 03-24 04:29:43.816: E/myBitmap(15392): null 03-24 04:29:43.816: D/AndroidRuntime(15392): Shutting down VM 03-24 04:29:43.817: E/AndroidRuntime(15392): FATAL EXCEPTION: main 03-24 04:29:43.817: E/AndroidRuntime(15392): Process: com.steve.test,PID: 15392 03-24 04:29:43.817: E/AndroidRuntime(15392): java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference 03-24 04:29:43.817: E/AndroidRuntime(15392): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:596) 03-24 04:29:43.817: E/AndroidRuntime(15392): at com.steve.test.SecondActivity$1.onResponse(SecondActivity.java:121) 03-24 04:29:43.817: E/AndroidRuntime(15392): at com.steve.test.SecondActivity$1.onResponse(SecondActivity.java:1) 03-24 04:29:43.817: E/AndroidRuntime(15392): at com.android.volley.toolBox.StringRequest.deliverResponse(StringRequest.java:60) 03-24 04:29:43.817: E/AndroidRuntime(15392): at com.android.volley.toolBox.StringRequest.deliverResponse(StringRequest.java:1) 03-24 04:29:43.817: E/AndroidRuntime(15392): at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 03-24 04:29:43.817: E/AndroidRuntime(15392): at android.os.Handler.handleCallback(Handler.java:739) 03-24 04:29:43.817: E/AndroidRuntime(15392): at android.os.Handler.dispatchMessage(Handler.java:95) 03-24 04:29:43.817: E/AndroidRuntime(15392): at android.os.Looper.loop(Looper.java:135) 03-24 04:29:43.817: E/AndroidRuntime(15392): at android.app.ActivityThread.main(ActivityThread.java:5221) 03-24 04:29:43.817: E/AndroidRuntime(15392): at java.lang.reflect.Method.invoke(Native Method) 03-24 04:29:43.817: E/AndroidRuntime(15392): at java.lang.reflect.Method.invoke(Method.java:372) 03-24 04:29:43.817: E/AndroidRuntime(15392): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 03-24 04:29:43.817: E/AndroidRuntime(15392): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
SecondActivity.java:
public class SecondActivity extends AppCompatActivity { String base64String; Bitmap bitmap; ImageView img ; String userValidationURL,base64; byte[] data; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second_activity); img = (ImageView)findViewById(R.id.imageView); base64String = "GvygDaYb64wUon0lxp2H1458543376"; userValidationURL = "http://example.com/api/v1/filedownloader.json?file=GvygDaYb64wUon0lxp2H1458543376"; hitSearchApi(); } private void hitSearchApi(){ Log.e("userValidationUrl",userValidationURL); StringRequest request = new StringRequest(Request.Method.GET,userValidationURL,new Response.Listener<String>() { @Override public void onResponse(String response) { if(response != null && !response.startsWith("<HTML>")){ Log.e("OnResponse",response); byte[] decodedString = Base64.decode("GvygDaYb64wUon0lxp2H1458543376",Base64.DEFAULT); Bitmap myBitmap = BitmapFactory.decodeByteArray(decodedString,decodedString.length); Log.e("mybitmap",""+myBitmap); img.setImageBitmap(Bitmap.createScaledBitmap(myBitmap,img.getWidth(),img.getHeight(),false)); dialog.dismiss(); }else{ Log.e("onResponseElse","onResponseElse"); dialog.dismiss(); } } },new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { if(error != null){ Log.e("error",error.toString()); dialog.dismiss(); } } }){ @Override protected Map<String,String> getParams(){ Map<String,String> params = new HashMap<String,String>(); params.put("file",base64String); Log.e("paramsImg",""+params); return params; } @Override public Map<String,String> getHeaders() throws AuthFailureError { Map<String,String>(); params.put("Content-Type","application/x-www-form-urlencoded"); return params; } }; RequestQueue queue = Volley.newRequestQueue(SecondActivity.this); queue.add(request); queue.getCache().remove(userValidationURL); } }
这段代码有什么问题?为什么我在位图中变为空.任何人都可以帮助我.
解决方法
03-24 04:29:43.816: D/skia(15392): — SkImageDecoder::Factory returned null
这表示BitmapFactory.decode的输入在某种程度上是无效的.
下面我列出了一些可能会欺骗您的情况,但不确定哪一种适用,因为您没有透露真实的网址,您发布的代码甚至不会尝试解码来自网络的数据.
Base64填充
您的硬编码输入字符串是GvygDaYb64wUon0lxp2H1458543376,它不是有效的Base64编码字符串.要了解为什么在页面上输入:http://string-functions.com/base64decode.aspx,它会说:
Invalid length for a Base-64 char array.
将其更改为GvygDaYb64wUon0lxp2H1458543376 ==(注意结束),它会显示你奇怪的字形,但这只是因为它是二进制数据,所以它成功解码.
奇怪的是,当缺少填充时,Base64类应该抛出异常,你没有得到…
您还可以检查Chrome中编码字符串的内容,将其输入到新标签的地址栏中(替换为逗号后,请参阅valid example):
data:image/png;base64,GvygDaYb64wUon0lxp2H1458543376==
我看到一个小方块,这可能不是图像(见下一节).
Base64格式
您尝试解码的示例也有一些奇怪的格式.它不是Android系统支持的PNG / GIF / JPEG文件,它缺少标题.查看支持的格式列表:http://developer.android.com/guide/appendix/media-formats.html(向下滚动到图像),这些是您可以加载的数据类型.
我尝试用笔记本电脑上的多个成像软件加载那个短字节[],没有将其识别为图像文件,我同意这些,我也不会在十六进制编辑器中看到任何图像.
Base64 – 不是!
如果您尝试解码变量响应,请确保它是一个Base64编码的字符串.上面的日志是一个JPEG文件,但它可能已损坏.请注意,您正在使用StringRequest,只有当您真正获得由[a-zA-Z0-9 / =]字符组成的Base64字符串时,该方法才有效.
要阅读二进制数据,您需要根据您的网络库启动不同类型的请求,但关键是如果您收到String格式的二进制数据,这意味着应用了一些文本编码,但是二进制数据没有字符编码,它只是纯粹的0x00-0xFF字节,没有任何解释.
BitmapFactory.decode对二进制数据将只有当您从网络库或InputStream接收到一个字节[]时(读者还具有与二进制数据错误的文本编码相关联).