3

私はアンドロイドとJavaのプログラミングが初めてです。私はftpサーバーに接続するために次のコードを書きます

public class NewMainActivity extends Activity {
TextView Display;
//declare a public FTP client object.
public FTPClient mFTPClient = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_main);
    final TextView Display = (TextView) findViewById(R.id.tvResults);

    try {
         mFTPClient = new FTPClient();

          // connecting to the host
         mFTPClient.connect("www.filegenie.com",21); 

          // now check the reply code, if positive mean connection success
          if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode())) {
              // login using username & password
              boolean status = mFTPClient.login("user", "MyPassword");

              // Set File Transfer Mode

              mFTPClient.setFileType(FTP.BINARY_FILE_TYPE);
              mFTPClient.enterLocalPassiveMode();

              Display.setText("Correct"+ String.valueOf(status)); //return status;
          }

        }catch(Exception e) {
             Display.setText(" Exception message is = "+e.getMessage()+" Reply code = "+mFTPClient.getReplyCode());

        }

}

このコードを実行すると、特定のエラーは発生しませんが、プログラムは mFTPClient.connect メソッドを実行せず、「Exception」部分にジャンプし、例外 getMessage として「null」、ReplyCode として「0」を取得します。次のような必要なすべてのファイルをインポートしました

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

私はEclipseとADT Build v22.0.1-685705を使用しています。また、android プロジェクトの lib に commons-net-3.3、commons-net-3.3-sources、および commons-net-examples-3.3 ファイルを含め、commons-net-3.3-src の Java ファイルとフォルダーも含めました。ソース | メイン | ジャバ | 組織 | アパッチ | コモンズ | フォルダー org | を作成して、net フォルダーを Android プロジェクトの src フォルダーに移動します。アパッチ | コモンズ | ネット。何が問題なのかわかりませんでした。この点で誰でも私を助けることができますか?

商用ftpクライアントでも同じサーバーにアクセスできます。

前もって感謝します。

4

1 に答える 1

4

私はあなたのコードを試しましたが、うまくいきます。取得している応答コードに基づいて、サーバーへの接続が確立されていないと思います。マニフェスト ファイルでアプリに INTERNET 権限を付与していることを確認してください。

<uses-permission android:name="android.permission.INTERNET" /> 

編集:例外スタック トレースから、このコードをメイン スレッドから実行しようとしていることは明らかです。Android 3.0 (Honeycomb) 以降では、デフォルトで UI スレッドでネットワーク呼び出しを実行することは許可されていません。理由は簡単です。ネットワーク呼び出しが無期限にブロックされ、アプリケーション UI が実質的にフリーズする可能性があるからです。それを修正する方法は 2 つあります。

怠惰な方法- ネットワーク呼び出しの therad チェックを無効にします。

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                                     .permitAll()
                                     .build();   
StrictMode.setThreadPolicy(policy);

を使用して、いつでもスレッドチェックを再度有効にすることができます

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                                     .detectAll()
                                     .penaltyLog()
                                     .penaltyDeath()
                                     .build();
StrictMode.setThreadPolicy(policy);

適切な方法- AsyncTask を使用して、バックグラウンド ワーカー スレッドから FTP 呼び出しを実行します。AsyncTasksに関する例と包括的な説明については、こちらをご覧ください。

于 2013-09-02T19:43:48.070 に答える