首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android中使用JCIFS

在Android中使用JCIFS
EN

Stack Overflow用户
提问于 2017-02-21 09:52:49
回答 2查看 5.2K关注 0票数 1

下面是这样的情况:我想用代码验证我的Android设备,通过向特定的URL发送用户名和密码,这个URL将具有内部和外部访问权限。通过读取主要工作是使用NTML连接到windows的JCIFS图书馆,试图使其在android中工作,我插入了以下代码:

代码语言:javascript
复制
        new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {

            try {
                String user = "username";
                String pass = "password";
                String sharedFolder = "shared";
                String url = "smb://url/url//" + sharedFolder + "/test.txt";
                NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(
                        null, user, pass);
                SmbFile sfile = new SmbFile(url, auth);
                sfile.canRead();
            } catch (Exception e) {
                e.printStackTrace();
            }




            return null;
        }
    }.execute();

这个示例代码只用于从Windows获得对我的Android应用程序的授权,我只想返回Auth,而不是复制文件或在文件之间进行比较。在阅读了UrlConnectionUrlStreamHandler之后,我失败了,并且尝试了StackOverFlow中几乎所有的问题,但是我没有找到答案。

此外,当我应用此代码时,所收到的消息是

代码语言:javascript
复制
02-21 04:50:02.329 3032-3046/ils.com.ntmlproject W/System.err: jcifs.smb.SmbException: Failed to connect to server
02-21 04:50:02.329 3032-3046/ils.com.ntmlproject W/System.err: java.net.UnknownHostException: jorphp01
02-21 04:50:02.329 3032-3046/ils.com.ntmlproject W/System.err:     at jcifs.UniAddress.getAllByName(UniAddress.java:315)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at jcifs.smb.SmbFile.getFirstAddress(SmbFile.java:864)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at jcifs.smb.SmbFile.connect(SmbFile.java:954)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at jcifs.smb.SmbFile.connect0(SmbFile.java:880)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at jcifs.smb.SmbFile.queryPath(SmbFile.java:1338)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at jcifs.smb.SmbFile.exists(SmbFile.java:1420)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at jcifs.smb.SmbFile.canRead(SmbFile.java:1462)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at ils.com.ntmlproject.MainActivity$1.doInBackground(MainActivity.java:51)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at ils.com.ntmlproject.MainActivity$1.doInBackground(MainActivity.java:39)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:287)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at java.lang.Thread.run(Thread.java:841)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at jcifs.smb.SmbFile.connect0(SmbFile.java:882)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at jcifs.smb.SmbFile.queryPath(SmbFile.java:1338)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at jcifs.smb.SmbFile.exists(SmbFile.java:1420)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at jcifs.smb.SmbFile.canRead(SmbFile.java:1462)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at ils.com.ntmlproject.MainActivity$1.doInBackground(MainActivity.java:51)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at ils.com.ntmlproject.MainActivity$1.doInBackground(MainActivity.java:39)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:287)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
02-21 04:50:02.339 3032-3046/ils.com.ntmlproject W/System.err:     at java.lang.Thread.run(Thread.java:841)

我不知道这个错误是否在http协议中?还是在密码里?我需要在这里调整什么,我错过了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-23 06:38:25

主机名:jorphp01不能从执行代码的设备解析。以下是可能的解决办法:

  1. 尝试将设备连接到同一个网络,并确保它通过相同的DNS服务器来解析此主机名。
  2. 如果可以访问服务器,但DNS解析失败,则修改配置的DNS服务器。可以帮助像https://play.google.com/store/apps/details?id=uk.co.mytechie.setDNS&hl=en这样的应用程序
  3. 尝试在设备上的客户端应用程序中配置IP地址而不是主机名。
  4. 修改/etc/ host文件(在根设备上),将主机名解析为首选IP地址。参考文献:https://www.howtogeek.com/140576/how-to-edit-the-hosts-file-on-android-and-block-web-sites/
票数 1
EN

Stack Overflow用户

发布于 2017-02-23 09:49:48

我发现了什么情况下的错误和我的案子的解决方案。首先,感谢“Pavan Kumar”回答这个问题,并给我一些提示。

  1. 我试图到达的服务器无法通过Android访问,因此我使用了服务器的IP地址而不是它的名称。
  2. 我已经在网络连接中应用了OkHTTP,使用jcifs库通过这种方法连接到我的服务器,在我的例子中工作得很好: TextView textView = (TextView) findViewById(R.id.tvResponse);新AsyncTask() {@覆盖受保护的字符串doInBackground(R.id.tvResponse){ HttpUrl.Builder urlBuilder = HttpUrl.parse("http://10.10.6.4/erpapi/").newBuilder();String url = urlBuilder.build().toString();//发出Get请求字符串getResponse = "";尝试{ getResponse = doGetRequest(url);System.out.println(getResponse);} catch (IOException e) { e.printStackTrace();getResponse = e.getMessage();}返回getResponse;}@重载受保护的onPostExecute(String s) { super.onPostExecute(s);textView.setText(s.toString().toLowerCase());}.execute();

其职能是:

代码语言:javascript
复制
static String doGetRequest(String url) throws IOException {
        okHttpClient = new OkHttpClient.Builder()
                .authenticator(new NTMLAuthenticator("username", "password"))
                .build();
        Request request = new Request.Builder()
                .url(url)
                .build();
        Response response = okHttpClient.newCall(request).execute();
        return response.body().string();}

此代码的来源,并使用jcifs库进行身份验证。

在此之后,我可以很容易地登录到服务器,并发送认证。

这些也是一些有用的资源,可以从以下方面看到:

httpclient

android-ntlm

ntlm-android中的身份验证

android-smb-cifs

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42363973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档