Apache Commons Net Lib和min- / targetsdkversion

时间:2013-08-02 20:08:19

标签: android ftp

我正在制作我的第一个Android应用程序,但我的代码产生了一个我无法理解的非常奇怪的行为。我现在使用谷歌三天没有解决方案。

如果我在AndroidManifest.xml中写了一个minSdkVersion而不是" 8",我就无法连接到我的FTP服务器。如果我使用minSdkVersion" 8"和" 8"以外的targetSdkVersion。如果我不使用minSdkVersion和targetSdkVersion一切正常。简而言之:

  • min 8,target 8 = ok
  • min 8,no target = ok
  • 没有分钟,没有目标= ok
  • min 8,目标17 =失败
  • min 10,目标10 =失败
  • 等......

这是我的AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.package"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="8"
          android:targetSdkVersion="17" />

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

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.package.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="com.examplepackage.Settings"></activity>
    <activity android:name="com.schmidgroup.sgfax.Tools"></activity>
    <activity android:name="com.schmidgroup.sgfax.MyFTP"></activity>
    <activity android:name="com.schmidgroup.sgfax.Printing"></activity>
    <activity android:name="com.schmidgroup.sgfax.Listings"></activity>
    <activity android:name="com.schmidgroup.sgfax.Blue"></activity>
 </application>
</manifest>

我的MainActivity.Java:

package com.example.package;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import android.content.Intent;
import android.view.MenuItem;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Button for Bluetooth-Connection
    Button verbinden = (Button) findViewById(R.id.button1);
    verbinden.setText(R.string.select_device);
    verbinden.setOnClickListener(new View.OnClickListener() {
        public void onClick(View arg0) {
            Intent start = new Intent(getApplicationContext(), Blue.class);
            startActivity(start);
        }
    } );
}
}

我的班级Blue.Java做了一些蓝牙的东西,然后启动了Listings.Java:

package com.example.package;

import java.io.IOException;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.view.View;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.TextView;

public class Listings extends Activity {

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.listings);

    // Connect zum FTP-Server
    MyFTP conn = new MyFTP();
    conn.ftpConnect(host, user, pass, 21);  
            [... some more FTP stuff which don't work in cause of failing Ftp Connection...]    
}
}

最后是MyFTP.Java:

package com.example.package;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.commons.net.ftp.*;
import android.content.Context;
import android.util.Log;

public class MyFTP {

private static void showServerReply(FTPClient FTPClient) {
    String[] replies = FTPClient.getReplyStrings();
    if (replies != null && replies.length > 0) {
        for (String aReply : replies) {
            System.out.println("SERVER: " + aReply);
        }
    }
}

//Now, declare a public FTP client object.
private static final String TAG = "MyFTPClient";
public FTPClient mFTPClient = null; 

//Method to connect to FTP server:
public boolean ftpConnect(String host, String username,
                          String password, int port)
{
    try {
        mFTPClient = new FTPClient();
        // connecting to the host
        mFTPClient.connect(host, port);
        showServerReply(mFTPClient);
        Log.i(TAG, "Successful conntected to " + host);
        // now check the reply code, if positive mean connection success
        if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode())) {
            // login using username & password
            boolean status = mFTPClient.login(username, password);
            Log.i(TAG, "Succesful logged in to " + host);
            /* Set File Transfer Mode
             *
             * To avoid corruption issue you must specified a correct
             * transfer mode, such as ASCII_FILE_TYPE, BINARY_FILE_TYPE,
             * EBCDIC_FILE_TYPE .etc. Here, I use BINARY_FILE_TYPE
             * for transferring text, image, and compressed files.
             */
            mFTPClient.setFileType(FTP.BINARY_FILE_TYPE);
            mFTPClient.enterLocalPassiveMode();

            return status;
        }
    } catch(Exception e) {
        Log.d(TAG, "Error: could not connect to host " + host );
    }

    return false;
} 
    [...and some more stuff...]

谁能看到我做错了什么? 谢谢!

1 个答案:

答案 0 :(得分:0)

您不应在主UI线程上进行任何网络操作。关注Android 3.0及更高版本中的StrictMode政策this question