Android 通过URL从IP摄像头获取快照图像

Android 通过URL从IP摄像头获取快照图像,android,android-image,android-bitmap,Android,Android Image,Android Bitmap,我正在尝试从海康威视IP摄像头URL获取图片,该URL的格式大致如下: 但是,正如您所注意到的,文件夹名为picture,没有直接链接到图像及其扩展名。当我使用毕加索库或正常的HttpConnection时,它无法获取图像/位图。我还可以如何检索图像?当我在web浏览器中输入URL时,它会完全加载,并显示图片为.jpeg格式。编辑 每当我尝试使用InputStream和Bitmap访问快照图像时,我都会收到FileNotFoundException错误达里奥指出的问题是身份验证。状态401被返回

我正在尝试从海康威视IP摄像头URL获取图片,该URL的格式大致如下:

但是,正如您所注意到的,文件夹名为picture,没有直接链接到图像及其扩展名。当我使用毕加索库或正常的HttpConnection时,它无法获取图像/位图。我还可以如何检索图像?当我在web浏览器中输入URL时,它会完全加载,并显示图片为.jpeg格式。

编辑

每当我尝试使用
InputStream
Bitmap
访问快照图像时,我都会收到
FileNotFoundException
错误

达里奥指出的问题是身份验证。状态401被返回,这就是抛出
FileNotFoundException
的原因。
有很多不推荐的方法,我的Gradle甚至无法获得一些类。
但是我在以下论坛的帮助下找到了另一种方法,因此,我结合了另一个页面进行身份验证,但我找不到该页面,因此有以下内容:

boolean isSaved = false;
         try {
             HttpClient client = new DefaultHttpClient();
             HttpGet request = new HttpGet();
             request.setURI(new URI(AppConst.IMAGE_URL));

             UsernamePasswordCredentials credentials =
                     new UsernamePasswordCredentials(AppConst.USERNAME, AppConst.PASSWORD);
             BasicScheme scheme = new BasicScheme();
             Header authorizationHeader = scheme.authenticate(credentials, request);
             request.addHeader(authorizationHeader);

             HttpResponse response = client.execute(request);
             Log.d("responseType",response!=null? response.getEntity().getContentType().toString():"emptyType");
             Log.d("responseCode", response != null ? String.valueOf(response.getStatusLine().getStatusCode()) : "emptyCode");
             if((response.getStatusLine().getStatusCode()==200) && (response.getEntity()!=null)){//status OK and not empty
                 //save stuff
                 HttpEntity entity = response.getEntity();
                 if (entity != null) {
                     InputStream instream = entity.getContent();
                     String path = APP_DIR+System.currentTimeMillis()+".jpg";
                     FileOutputStream output = new FileOutputStream(path);
                     int bufferSize = 1024;
                     byte[] buffer = new byte[bufferSize];
                     int len = 0;
                     while ((len = instream.read(buffer)) != -1) {
                         output.write(buffer, 0, len);
                     }
                     output.close();
                     Log.d("Snapshot Filename: ", path);
                     isSaved = true;
                 }

             }else{
                 isSaved= false;
             }
         }catch (Exception ex){
             Log.e("saveImageError",ex!=null? ex.getMessage():"error");
         }



必须在android的
org.apache.http.legacy>部分下的渐变中添加以下行:
usebrary'org.apache.http.legacy'

尝试使用浏览器的开发工具查看该URL是否重定向到另一个URL,但即使在这种情况下,您也不应收到FileNotFoundException。您确定从客户端访问了正确的ip和端口吗?已经这样做了,URL是相同的。我很确定,我甚至将它从我的android studio项目直接复制粘贴到浏览器中,它在@Dariopicco上工作了。你用真正的设备来调试吗?如果是,请尝试将相同的url放入移动设备的浏览器中,并检查IP摄像头是否使用身份验证。或者,如果IPCamera是公共的,请粘贴一个临时链接。PS:你在你的应用程序清单中添加了互联网吗?我使用的是真正的设备,流可以通过SurfaceView对象通过,但因为我不知道如何从中捕获图像,我决定直接从IP摄像头获取。它使用身份验证,我已经传递了身份验证的详细信息。在浏览器中粘贴身份验证详细信息的相同url可以正常工作@DarioPiccoI尝试使用真正的设备,但我没有收到FileNotFount,而是收到状态代码401-未经授权。您在哪一行收到FileNotFound异常?我们遇到了相同的问题,我们尝试了您的代码,但得到了相同的401错误。你能帮我吗…HttpResponse response=client.execute(request);我们得到了这一行的错误。并且状态不是200,response.getStatusLine().getStatusCode()==200。收到401错误。您好,我在android中收到arryindexoutofbound异常。@gowthami您能否更具体地说明您的问题,您尝试过什么,没有尝试过什么,异常在哪里引发,您使用的相机型号和固件版本是什么?@iOS如上所述,状态代码401是身份验证问题。你的工作是什么?