当前位置: 首页 > 知识库问答 >
问题:

通过URL获取图像的问题

端木安国
2023-03-14

我在我的RPi上托管了一个webservice,我有一个。png图像,我可以从android设备通过网络访问。这是我获取该图像的代码:

// Write image to image view
public static Bitmap getBitmapFromURL(String src) {
    try {
        URL url = new URL(src);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        return BitmapFactory.decodeStream(input);

    } catch (IOException e) {
        e.getMessage();
        return null;
    }
}

在这里,当单击按钮时(在Oncreate事件中),我会将图像显示到图像视图中:

Button picturebutton = (Button) findViewById(R.id.btngetpic);
    final ImageView myview = (ImageView) findViewById(R.id.imgview1);

    assert picturebutton != null;
    picturebutton.setOnClickListener(
            new Button.OnClickListener() {
                public void onClick(View v) {
                    TextView mytext = (TextView) findViewById(R.id.mytext);
                    mytext.setText("done");
                    myview.setImageBitmap(getBitmapFromURL("http://169.254.XXX.XXX/Images/Itworks.png"));
                }
            }
    );

我的用户清单中有互联网,但每当我运行应用程序时,它就会强制关闭。我觉得这和我的听众有关,但我无法解决。谢谢你的帮助,因为我非常困惑。(虽然我有java desktop的经验,但我对Android开发还是新手)

编辑:我的异常堆栈从它强制关闭的地方开始

07-13 18:14:00.718 4077-4077/? E/AndroidRuntime: FATAL EXCEPTION: main
                                             Process: com.example.neil.access_control, PID: 4077
                                             android.os.NetworkOnMainThreadException
                                                 at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
                                                 at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
                                                 at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
                                                 at libcore.io.IoBridge.connect(IoBridge.java:122)
                                                 at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
                                                 at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:452)
                                                 at java.net.Socket.connect(Socket.java:884)
                                                 at com.android.okhttp.internal.Platform.connectSocket(Platform.java:117)
                                                 at com.android.okhttp.internal.http.SocketConnector.connectRawSocket(SocketConnector.java:160)
                                                 at com.android.okhttp.internal.http.SocketConnector.connectCleartext(SocketConnector.java:67)
                                                 at com.android.okhttp.Connection.connect(Connection.java:152)
                                                 at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:185)
                                                 at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128)
                                                 at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:341)
                                                 at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
                                                 at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
                                                 at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:433)
                                                 at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)
                                                 at com.example.neil.access_control.MainActivity.getBitmapFromURL(MainActivity.java:71)
                                                 at com.example.neil.access_control.MainActivity$1.onClick(MainActivity.java:54)
                                                 at android.view.View.performClick(View.java:5198)
                                                 at android.view.View$PerformClick.run(View.java:21147)
                                                 at android.os.Handler.handleCallback(Handler.java:739)
                                                 at android.os.Handler.dispatchMessage(Handler.java:95)
                                                 at android.os.Looper.loop(Looper.java:148)
                                                 at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

07-13 18:14:00.727 1283-3180/? 带ActivityManager:强制完成活动com。实例尼尔。访问控制/。主要活动

共有2个答案

田宇
2023-03-14

我知道这是一个“替代”解决你的问题,但我想张贴它,因为当我遇到它试图解决我的一系列问题时,它也对我有帮助。

我建议您使用Picasso作为您的图像加载器,因为它可以从URL加载图像,并且它还为您提供:

  • 缓存机制
  • 图像转换实用程序

它就这么简单

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

另一方面,如果只加载位图,您可以执行以下操作(如本SO答案中所述):

    Target target = new Target() {
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            /* Do something with the bitmap*/
        }

        @Override
        public void onBitmapFailed(Drawable errorDrawable) {
            /* handle failure */
        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
            /* you may execute some logic before loading*/
        }
    };
    Picasso.with(context).load(imageURL).into(target);

注:我与毕加索没有任何关系

夏弘文
2023-03-14

你的问题是:NetworkOnMainThreadException,你可以在这里阅读文档,但重要的是Android不能在主线程(图形用户界面)上进行“阻塞操作”。

使用AsynkTask或其他线程查询互联网/网络中的数据。

虽然毕加索是一个很好的“图像库”,但我也强烈建议(从谷歌)截取,它有一个优秀的文档,以及几个例子。不仅如此,凌空还将“微观管理”设备上可用网络的最佳库)。

注意,HttpURLConnection在API 19 KitKat上不推荐使用IIRC

 类似资料:
  • 我尝试此操作时出现以下错误 警告:fopen(/var/www/ajaxForm/loading.gif):无法打开流:在/var/www/curlmimage中没有这样的文件或目录。php第5行警告:fwrite()希望参数1是资源,布尔值在/var/www/curlmimage中给出。php第6行警告:fclose()希望参数1是资源,布尔值在/var/www/curlmimage中给出。ph

  • 我一直在到处寻找答案,但没有任何帮助。 这是我的代码: 当我试图读取URL时,下面出现了一个异常。 任何帮助都会很好。我正在尝试读取url内部的图像,并将其与现有文件进行比较。这里没有任何问题给出答案。 编辑: 我尝试在命令行“keytool-list-keystore keystore”中输入,但它只显示给我TrustedCertentries。还没有解决方案奏效。

  • 我想知道是否有API可以批量获取维基百科页面的图像URL。 我看到的API是https://en.wikipedia.org/w/api.php?action=query 但是我只得到第一个标题的图片URL。

  • 问题内容: 我已经制作了一个使用JSON Google图像搜索API来提供图像的android应用,但是我注意到Google不再支持它。我还发现Wikidata有时会在某些项目上提供图像属性,但是我似乎无法使用Wikidata API获得图像的URL位置。 有什么方法可以从Wikidata中的项目获取图像URL属性吗? 问题答案: 如果某些Wikidata项(ID为 Qxxx )具有图片(P18)

  • 我想从获取图像:

  • 问题内容: 我正在尝试阅读以下图片 但是它显示了IIOException。 这是代码: 问题答案: 您收到(错误请求)错误,因为您的网址中有。如果在参数之前对其进行了修复,则会收到错误消息(未经授权)。也许您需要一些HTTP标头才能将您的下载标识为可识别的浏览器(使用“ User-Agent”标头)或其他身份验证参数。 对于User-Agent示例,然后通过连接inputstream 使用Imag