0

API レベル 8 および 9 で動作するファイル送信者コードがあります。しかし、ターゲット API レベルを 16 または 17 に変更すると、エラーが発生し、プログラムが直接終了します。<"android:targetSdkVersion=.."> プロパティを削除すると機能します。しかし、そのプロパティを 16 または 17 レベルとして記述する必要があります。16 または 17 の API レベルで作業する必要があります。(私の nexus 7 バージョン 4.2.2 (api lvl 17) では、usb アプリケーションに 16/17 api lvl プロパティを使用します)

作業送信ファイルのコードは次のとおりです。

SendButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            try {
                    Socket sock = new Socket("192.168.2.7",5656); 
                    File myFile = new File ("/mnt/sdcard/TEST/TEST.xml");
                    byte [] mybytearray  = new byte [(int)myFile.length()];
                    FileInputStream fis = new FileInputStream(myFile);
                    BufferedInputStream bis = new BufferedInputStream(fis);
                    bis.read(mybytearray,0,mybytearray.length);
                    OutputStream os = sock.getOutputStream();
                    os.write(mybytearray,0,mybytearray.length);
                    os.flush();
                    sock.close();
                }   
            catch (IOException e) {
            }   
        }
    });

私の Android マニフェスト ファイルのバージョンとアクセス許可は次のとおりです。

    android:minSdkVersion="8"
    android:targetSdkVersion="8" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

コードはそのように機能します。しかし、私は android:targetSdkVersion="16 or 17" を変更する必要があります。

その問題に関する解決策と、Nexus7で修正するにはどうすればよいですか?

4

1 に答える 1

1

より高いバージョンの API を使用して UI Thread で Network からのデータを処理すると、例外 (NetworkOnMainThreadException) がスローされるためです。そのため、ワーク スレッドでネットワーク データを処理する必要があります。

public void onClick(View v) {
      new Thread(new Runnable() {
            public void run() {    
                try { 
                    Socket sock = new Socket("192.168.2.7",5656); 
                    File myFile = new File ("/mnt/sdcard/TEST/TEST.xml");
                    byte [] mybytearray  = new byte [(int)myFile.length()];
                    FileInputStream fis = new FileInputStream(myFile);
                    BufferedInputStream bis = new BufferedInputStream(fis);
                    bis.read(mybytearray,0,mybytearray.length);
                    OutputStream os = sock.getOutputStream();
                    os.write(mybytearray,0,mybytearray.length);
                    os.flush();
                    sock.close();
                }catch (IOException e) {
                } 
             }
          }).start();
      }

詳細については、http://developer.android.com/reference/android/os/NetworkOnMainThreadException.htmlを参照してください。

API 11 で追加されました。

于 2013-05-02T06:47:55.260 に答える