JCIFSを使ってwindows共有フォルダをandroid端末を使って参照する

4,109 views
Skip to first unread message

あいくアイス

unread,
Jan 10, 2014, 8:31:22 PM1/10/14
to android-g...@googlegroups.com
package com.example.connect2;

import jcifs.smb.SmbFile;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    private Button btn;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn = (Button)findViewById(R.id.button01);
        btn.setText("Push");
        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v){
        if(v == btn){
            try {
                SmbFile file = new SmbFile("smb://ユーザ名;nil:パスワード@サーバ名/パス");
     
                String[] filenames = file.list();
                for (int i = 0; i < filenames.length; i++) {
                    System.out.println(filenames[i]);
                }
            } catch (Exception e ) {
                e.printStackTrace();
            }
        }
    }
}

ボタンを押すと共有フォルダにアクセスする、という感じになっています。
しかし実際はボタンを押すと動作が停止してしまい、それ以上はアプリは強制終了します。
根本的に何か間違っているのか 共有フォルダへのアクセスの指定("smb://ユーザ名;nil:パスワード@サーバ名/パス")が間違っているのかよくわかりません。
どうか教えてください。

田代透

unread,
Jan 11, 2014, 7:52:58 AM1/11/14
to android-g...@googlegroups.com
logcatを確認するとどんなエラーが発生しているか記録されています。
まずは、それを確認しましょう。


2014/1/11 あいくアイス <adkc...@gmail.com>

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
--
Toru Tashiro
toru...@gmail.com

Shinichi Arata

unread,
Jan 13, 2014, 2:45:07 AM1/13/14
to android-g...@googlegroups.com
横から失礼します。
jCIFSというライブラリーに興味があったので、少し試してみました。

私が試したところ、ハマりどころは3つ位ありそうな感じでした。

1. ネットワークにアクセスするためのパーミッションが必要。
2. ディレクトリの内容の一覧の取得の場合、パスの最後は / (スラッシュ)である必要がある
3. Android 3.0以降の場合、メインスレッドからネットワーク処理は行えない。
   (AsyncTask等を使う)

3の参考: 

いずれにしても、logcatに該当するエラーメッセージが出ているように思います。

参考になれば幸いです。


2014年1月11日 21:52 田代透 <toru...@gmail.com>:

あいくアイス

unread,
Jan 13, 2014, 7:12:48 PM1/13/14
to android-g...@googlegroups.com
ありがとうございます。
たしかにLogcatに色々出てきたようです。
エラーの意味など調べてみます。

あいくアイス

unread,
Jan 13, 2014, 7:20:39 PM1/13/14
to android-g...@googlegroups.com
普通に実装しただけでは動かないようですね。
教えていただきありがとうございます。
これから色々試してみます。

Idlks Gtprkht

unread,
Jan 16, 2014, 6:05:48 AM1/16/14
to android-g...@googlegroups.com
こんにちは

smb://"ドメイン(省略可);ユーザ名:パスワード(省略可)@サーバ名/パス
ではないでしょうか?

私はそれで繋がってます。

よろしくお願いします。

2014年1月11日土曜日 10時31分22秒 UTC+9 あいくアイス:

ion1031

unread,
Jan 17, 2014, 4:30:13 AM1/17/14
to android-g...@googlegroups.com
こんばんわ。

質問者でもないのに質問投稿失礼いたします。
ただいま私もあいくアイス様と同じようにWindows共有フォルダをandroid端末から参照するアプリを制作しております。
しかし、見事にSmbFile file = new SmbFile("smb://ドメイン(省略可);ユーザ名:password@コンピュータ名/パス/");
で強制終了するという詰まり具合です。
コメントなどにして調べましたところやはりこの1文のようなのですが、特に@より後ろの記述について詳しく聞きたい所存です。
かっぱ大王様が注意をした3つの点は滞りなく行えたと思うのですが、なぜうまく見に行ってくれないのかわかりません。
サーバ用のPCはWindows Server 2008 R2 のファイルサーバにてF:ドライブ(mitai)を共有としています。
@後ろは@コンピュータ名/\\コンピュータ名\\mitai/
と表記しています。
よろしくお願いします。

2014年1月16日木曜日 20時05分48秒 UTC+9 Idlks Gtprkht:

Idlks Gtprkht

unread,
Jan 17, 2014, 5:30:41 AM1/17/14
to android-g...@googlegroups.com
Logcat公開して頂ければ何か判るかも知れませんが、JCIFSの接続自体はそんな難しいものじゃないので、ネットワーク環境がきちんとしているのであれば、ファイル名の表記が何か違っているのだと思います。
ちなみにスラッシュとバックスラッシュが混在しているようにも見えますが、これは正しいのでしょうか?

あと、一度ESファイルマネージャとかでLAN接続できるか試してみたらいかがでしょう。
あれもJCIFSを使っているらしいので、それで繋がらないようでしたら環境に問題があるのだと思います。

宜しくおねがいします。

ion1031

unread,
Jan 17, 2014, 7:17:25 PM1/17/14
to android-g...@googlegroups.com
おはようございます。
Logcatのタグとエラー文を抜粋してきました。
Could not find class 'java.awt.Window', referenced from method com.trend.iwss.jscan.runtime.Session.closeAllActiveWindows
Could not find class 'java.awt.Dialog', referenced from method com.trend.iwss.jscan.runtime.Session.closeAllOpenDialogs
Could not find class 'java.applet.Applet', referenced from method com.trend.iwss.jscan.runtime.Session.getActiveFrame
Could not find class 'java.applet.Applet', referenced from method com.trend.iwss.jscan.runtime.PolicyRuntime.report
Could not find class 'java.applet.Applet', referenced from method com.trend.iwss.jscan.runtime.PolicyRuntime.stopApplets
ここまでのタグ---dalvikvm
FATAL EXCEPTION: main
java.lang.ExceptionInInitializerError
 at com.example.asynctest.AsyncTest2.onPreExecute(AsyncTest2.java:36)
 at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:549)
 at android.os.AsyncTask.execute(AsyncTask.java:499)
 at com.example.asynctest.AsyncTest.onClick(AsyncTest.java:25)
 at android.view.View.performClick(View.java:3110)
 at android.view.View$PerformClick.run(View.java:11934)
 at android.os.Handler.handleCallback(Handler.java:587)
 at android.os.Handler.dispatchMessage(Handler.java:92)
 at android.os.Looper.loop(Looper.java:132)
 at android.app.ActivityThread.main(ActivityThread.java:4123)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:491)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
 at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NoClassDefFoundError: java.applet.Applet
 at com.trend.iwss.jscan.runtime.Session.setAppletInstance(Session.java:88)
 at jcifs.smb.SmbFile.<clinit>(SmbFile.java)
ここまでのタグ---AndroidRuntime
 ... 15 more

多すぎて申し訳ないです。そもそもこの前提すらできていない気もバリバリいたしますが
よろしくお願いします。


2014年1月17日金曜日 19時30分41秒 UTC+9 Idlks Gtprkht:

Idlks Gtprkht

unread,
Jan 18, 2014, 2:15:30 AM1/18/14
to android-g...@googlegroups.com
awtとか普通androidでは使わないクラスを参照しにいってるのでエラーになっているようです。

JCIFSのバージョンは最新でしょうか?

よろしくお願いします。

ion1031

unread,
Jan 18, 2014, 3:16:52 AM1/18/14
to android-g...@googlegroups.com
JCIFSのバージョンは最新のようです。
が、Webを見ているとJCIFSを使うための前提?ができていませんでした。
JCIFSを使うためAndroidManifest.xmlに何かを追加しなければいけないという条件をクリアしていないよう。
しかしその何かが分からずつまっています。

何度も回答ありがとうございます。

よろしくお願いします。

2014年1月18日土曜日 16時15分30秒 UTC+9 Idlks Gtprkht:
awtとか普通androidでは使わないクラスを参照しにいってるのでエラーになっているようです。

JCIFSのバージョンは最新でしょうか?

よろしくお願いします。

Shinichi Arata

unread,
Jan 19, 2014, 7:03:20 AM1/19/14
to android-g...@googlegroups.com
かっぱ大王です。

状況をもう少し詳しく教えて頂けると、何らかの回答ができるかもしれません。

1. 前の方も答えていますが、Applet等のクラスを参照しているのは???です。
プロジェクトの中で、Applet等を使っていないか確認して頂いたほうがいいかもしれません。

Could not find class 'java.awt.Window', referenced from method com.trend.iwss.jscan.runtime.Session.closeAllActiveWindows
Could not find class 'java.awt.Dialog', referenced from method com.trend.iwss.jscan.runtime.Session.closeAllOpenDialogs
Could not find class 'java.applet.Applet', referenced from method com.trend.iwss.jscan.runtime.Session.getActiveFrame
Could not find class 'java.applet.Applet', referenced from method com.trend.iwss.jscan.runtime.PolicyRuntime.report
Could not find class 'java.applet.Applet', referenced from method com.trend.iwss.jscan.runtime.PolicyRuntime.stopApplets

2. 開発環境の確認。
開発環境はEclipseでしょうか?
手元のEclipseの環境でAndroid アプリケーション プロジェクトを作成した場合には、
Applet等は参照できません(コンパイルできない)でした。
EclipseのAndroid アプリケーション プロジェクトになっているかも気になります。

3. jCIFSの参照
jCIFSは、プロジェクトのルートのlibsフォルダに、jCIFSのjarを
置いただけです。

以上、参考になれば幸いです。


2014年1月18日 17:16 ion1031 <ion.nice...@gmail.com>:

--

ion1031

unread,
Jan 19, 2014, 8:01:27 PM1/19/14
to android-g...@googlegroups.com
おはようございます。

公開している情報が少なすぎました。申し訳ありません。
開発環境:Eclipse4.2JUNO / JDK7u45  /  Android SDK (ExtrasとToolsは全部入れています)
JCIFS 1.3.17 (参照ライブラリーへ外部jarで追加)
Manifestにandroid.permission.INTERNET (Uses Permission)追加


今のところのソースコード↓

AsyncTest.java(メインスレ)
---------------------------------------------------------------------------------------------------------------------------------------------
package com.example.asynctest;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class AsyncTest extends Activity
  implements OnClickListener {
 
  final String TAG = "AsyncTest";

 
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_async_test);
    ((Button)findViewById(R.id.button1))

      .setOnClickListener(this);
  }
 
  @Override
  public void onClick(View v) {
    if(v.getId() == R.id.button1){
      new AsyncTest2(this).execute("Param1");
    }
  }
 
}

AsyncTest2.java(サブスレ)
----------------------------------------------------------------------------------------------------------------------------------------------
package com.example.asynctest;
import jcifs.smb.SmbFile;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.AsyncTask;
import android.util.Log;

public class AsyncTest2
  extends AsyncTask<String, Integer, Long>

  implements OnCancelListener{
  final String TAG = "MyAsyncTask";
  ProgressDialog dialog;
  Context context;
 
  public AsyncTest2(Context context){
    this.context = context;
  }
 
  @Override
  protected void onPreExecute() {
    Log.d(TAG, "onPreExecute");
    dialog = new ProgressDialog(context);
    dialog.setTitle("Please wait");
    dialog.setMessage("Loading data...");
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    dialog.setCancelable(true);
    dialog.setOnCancelListener(this);
    dialog.setMax(100);
    dialog.setProgress(0);
    dialog.show();
    try {
        SmbFile file = new SmbFile("smb://ユーザ名:パスワード@サーバ名(コンピュータ名?)/パス/");

   
        String[] filenames = file.list();
        for (int i = 0; i < filenames.length; i++) {
           System.out.println(filenames[i]);
        }
    } catch (Exception e ) {
        e.printStackTrace();
    }
   
  }

 
  @Override
  protected Long doInBackground(String... params) {
    Log.d(TAG, "doInBackground - " + params[0]);
   
    try {
      for(int i=0; i<10; i++){
        if(isCancelled()){
          Log.d(TAG, "Cancelled!");
          break;
        }
        Thread.sleep(1000);
        publishProgress((i+1) * 10);
      }
    } catch (InterruptedException e) {
      Log.d(TAG, "InterruptedException in doInBackground");
    } 
    return 123L;
  }
 
  @Override
  protected void onProgressUpdate(Integer... values) {
    Log.d(TAG, "onProgressUpdate - " + values[0]);
    dialog.setProgress(values[0]);
  }
 
  @Override
  protected void onCancelled() {
    Log.d(TAG, "onCancelled");
    dialog.dismiss();
  }
  @Override
  protected void onPostExecute(Long result) {
    Log.d(TAG, "onPostExecute - " + result);
    dialog.dismiss();
  }
  @Override
  public void onCancel(DialogInterface dialog) {
    Log.d(TAG, "Dialog onCancell... calling cancel(true)");
    this.cancel(true);
  }
}

---------------------------------------------------------------------------------------------------------------------
動作
smb()付近をコメントアウトしていると、
起動
ボタン表示(クリックすると・・・)
please waitとゲージ上昇(10%ずつ)
100%になると、起動時の画面に戻る。

です。
smb()をいれると
エラー
LogCat
-------------------------------------------------------------------------------------------
java.lang.ExceptionInInitializerError
 at jcifs.smb.SmbFile.getFirstAddress(SmbFile.java:864)
 at jcifs.smb.SmbFile.connect(SmbFile.java:951)
 at jcifs.smb.SmbFile.connect0(SmbFile.java:880)
 at jcifs.smb.SmbFile.getType(SmbFile.java:1282)
 at jcifs.smb.SmbFile.doEnum(SmbFile.java:1733)
 at jcifs.smb.SmbFile.list(SmbFile.java:1709)
 at jcifs.smb.SmbFile.list(SmbFile.java:1606)
 at com.example.asynctest.AsyncTest2.onPreExecute(AsyncTest2.java:41)

 at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:549)
 at android.os.AsyncTask.execute(AsyncTask.java:499)
 at com.example.asynctest.AsyncTest.onClick(AsyncTest.java:25)
 at android.view.View.performClick(View.java:3110)
 at android.view.View$PerformClick.run(View.java:11934)
 at android.os.Handler.handleCallback(Handler.java:587)
 at android.os.Handler.dispatchMessage(Handler.java:92)
 at android.os.Looper.loop(Looper.java:132)
 at android.app.ActivityThread.main(ActivityThread.java:4123)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:491)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
 at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ExceptionInInitializerError
 at jcifs.UniAddress.<clinit>(UniAddress.java:62)
 ... 22 more
Caused by: android.os.NetworkOnMainThreadException
 at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
 at java.net.InetAddress.lookupHostByName(InetAddress.java:477)
 at java.net.InetAddress.getLocalHost(InetAddress.java:445)
 at jcifs.netbios.NbtAddress.<clinit>(NbtAddress.java:187)
 ... 23 more
タグ---AndroidRuntime

-------------------------------------------------------------------------------------------------------------------------------------
以上です。長文申し訳ありませんが、どう解決しファイルサーバへとつなぐことができるのか・・

よろしくお願いします。

2014年1月19日日曜日 21時03分20秒 UTC+9 かっぱ大王:
このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

Shinichi Arata

unread,
Jan 19, 2014, 10:02:34 PM1/19/14
to android-g...@googlegroups.com
かっぱ大王です

手元に環境がないので確認は取れないのですが、

SmbFileの処理をonPreExecuteで行っているためエラーになっているのでは
ないでしょうか。

以下の部分を

try {
        SmbFile file = new SmbFile("smb://ユーザ名:パスワード@サーバ名(コンピュータ名?)/パス/");

    
        String[] filenames = file.list();
        for (int i = 0; i < filenames.length; i++) {
           System.out.println(filenames[i]);
        }
    } catch (Exception e ) {
        e.printStackTrace();
    }

doInBackgroundに記述すると動きそうな気がします。

以上、よろしくお願い致します。


2014年1月20日 10:01 ion1031 <ion.nice...@gmail.com>:
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。

ion1031

unread,
Jan 20, 2014, 7:27:10 AM1/20/14
to android-g...@googlegroups.com
こんばんわ。
 
smb()あたりのくだりを指摘していただいたところに移動させて動作させたところ正常に動きました!!!
ためしにログキャットにファイル名を表示させてみましたところ、しっかりと取得していることが確認できました!!
あとはアンドロイドの画面にファイルとして表示させ、クリックしたりすると中が開けたりするようにとアレンジしていくので
頑張りたいと思います。
 
ここの記事の質問者でもないのに、長々と投稿してしまい申し訳ないですが、
Idlks Gtprkhtさま かっぱ大王さま、本当に感謝しております。
 
ありがとうございました。

2014年1月20日月曜日 12時02分34秒 UTC+9 かっぱ大王:
このグループに投稿するには、android-group-jap...@googlegroups.com にメールを送信してください。

http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。

ohisamallc

unread,
Jan 20, 2014, 10:03:50 PM1/20/14
to android-g...@googlegroups.com
山形のohisamaです。
山形は、雪降りが一休みです。
がんばろう、東北。

興味あったんで、android1.5で
追っかけ検証して、見ました。

自分が踏んだ地雷。
 SmbException.getNtStatus()で、エラー番号は見れる。
 無線LANルーター設定、「ネットワーク分離」では、ダメ。
 時間かかるので、AsyncTaskから呼ぶ。
 jcifs-1.1.11.jar は、ダメ、jcifs-1.3.17.jarを使へ。
ご参考迄に
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。

あいくアイス

unread,
Jan 21, 2014, 3:18:15 AM1/21/14
to android-g...@googlegroups.com
ohisamaさまありがとうございます!
私もAsyncTaskを使った処理のところで躓いてました、現在はwindowsに繋がるところまでは行ってます。
ありがとうございました!

2014年1月21日火曜日 12時03分50秒 UTC+9 ohisama:
このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。
Reply all
Reply to author
Forward
0 new messages