2016-04-08 1 views
0

ボタンを押してカメラを起動し、写真を撮ってこの写真をSDカードに保存してからアップロードする非常に簡単なアプリを開発しています私のFTP。私はFTPに接続するためにsimpleFTPライブラリを使用していますが、なぜファイルをアップロードするときに以下のエラーが出るのかわかりません。Java - Android - FTPによるメインスレッドの例外アップロード

これは、メインクラスからのコードの関連する部分である:

private void dispatchTakePictureIntent() { 
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
     // Create the File where the photo should go 
     photoFile = null; 
     try { 
      photoFile = createImageFile(); 
      Log.v("photoFile", photoFile.toString()); 
     } catch (IOException ex) { 
      // Error occurred while creating the File 

     } 
     // Continue only if the File was successfully created 
     if (photoFile != null) { 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 

      startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); 
     } 
    } 

} 

private File createImageFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES); 
    File image = File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
    ); 

    // Save a file: path for use with ACTION_VIEW intents 
    mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
    return image; 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
     //The image is already stored in the phone, let's open it up from there 
     File imgFile = photoFile; 
     if(imgFile.exists()){ 

      Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 

      mImageView.setImageBitmap(myBitmap); 

     } 

     new UploadFTP<File>().doInBackground(imgFile); 
    } 
} 

そして、これがAsycnTaskのハンドルクラスです:

class UploadFTP<File> extends AsyncTask<File, Void, Void> { 


@Override 
protected Void doInBackground(File... params) { 
    File file = params[0]; 
    try 
    { 
     SimpleFTP ftp = new SimpleFTP(); 

     // Connect to an FTP server on port 21. 
     ftp.connect("ftp.myurl", 21, "myuser", "mypass"); 

     // Set binary mode. 
     ftp.bin(); 

     // Change to a new working directory on the FTP server. 
     ftp.cwd("www/xxx"); 

     // Upload files. 
     ftp.stor(new java.io.File(String.valueOf(file))); 

     ftp.disconnect(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
    return null; 
} 
} 

そして、ここでエラー:

FATAL EXCEPTION: main 
    Process: com.ignistudios.photosharing, PID: 22214 
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {com.ignistudios.photosharing/com.ignistudios.photosharing.MainActivity}: android.os.NetworkOnMainThreadException 
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3607) 
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3650) 
    at android.app.ActivityThread.access$1400(ActivityThread.java:154) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1370) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5294) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 
    Caused by: android.os.NetworkOnMainThreadException 
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147) 
    at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110) 
    at libcore.io.IoBridge.connectErrno(IoBridge.java:137) 
    at libcore.io.IoBridge.connect(IoBridge.java:122) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:163) 
    at java.net.Socket.startupSocket(Socket.java:590) 
    at java.net.Socket.tryAllAddresses(Socket.java:128) 
    at java.net.Socket.<init>(Socket.java:178) 
    at java.net.Socket.<init>(Socket.java:150) 
    at org.jibble.simpleftp.SimpleFTP.connect(SimpleFTP.java:68) 
    at com.ignistudios.photosharing.UploadFTP.doInBackground(UploadFTP.java:26) 
    at com.ignistudios.photosharing.MainActivity.onActivityResult(MainActivity.java:139) 
    at android.app.Activity.dispatchActivityResult(Activity.java:6192) 
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3603) 
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3650)  
    at android.app.ActivityThread.access$1400(ActivityThread.java:154)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1370)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:135)  
    at android.app.ActivityThread.main(ActivityThread.java:5294)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:372)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)  

答えて

1

あなたはAsyncTaskを間違った方法で使用しています。 executeを呼び出すと、ネットワーク操作が許可されている別のスレッドで自動的にdoInBackground()が呼び出されます。

UploadFTP uploadFTP = new UploadFTP(); 
uploadFTP.execute(); 
+0

素晴らしい!あなたは非常に尊敬します。私は別のエラーが発生しています:java.io.IOException:SimpleFTPは、FTPサーバーに接続するときに不明な応答を受け取りました:220 --------- - Pure-FTPdへようこそ[privsep] [TLS] ----------サーバーの設定に問題がありますか? – Gosdi

+0

@Gosdi、サーバーやAPI(SimpleFTP)の問題のようですあなたが使用しています。私の答えがあなたに初期のエラーを解決するのを助けたなら、それをupvoteまたは答えとしてマークしてください – 0xDEADC0DE

関連する問題