###前提・実現したいこと
AndroidStudioでpicture.pngというpngの画像ファイルを
サーバにPOST送信するメソッドをsubActivityクラスに作りました。
(色んなサイトのコードを参考に、というかコピペして作りました…(:_;))
ですがMainActivityでsubActivityをextendsして
メソッドを実行しようとすると、
「問題が発生したため、~を終了します。」という
メッセージが表示され、アプリが強制終了してしまいます。
###発生している問題・エラーメッセージ
問題が発生したため、~(アプリ名)を終了します。
###参考にしたページ
Androidから動画ファイルをアップロード
http://wiki.toridge.com/index.php?android-%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89(okHttp3)
OkHttp3を学ぶ。①AsyncTaskで画像を連続取得
http://qiita.com/kmry2045/items/870127b1dc6b25bbcbdf
###該当のソースコード
↓subActivity.java
Java
1 2import android.app.Activity; 3import android.os.AsyncTask; 4import android.os.Environment; 5import android.util.Log; 6import android.widget.TextView; 7 8import java.io.File; 9import java.io.IOException; 10 11import okhttp3.Headers; 12import okhttp3.MediaType; 13import okhttp3.MultipartBody; 14import okhttp3.OkHttpClient; 15import okhttp3.Request; 16import okhttp3.RequestBody; 17import okhttp3.Response; 18import okio.Buffer; 19 20/** 21 * Created by m2cha on 2016/09/16. 22 */ 23public class subActivity extends Activity { 24 25 private String TAG = "Activity"; 26 private TextView mtextView; 27 int RESULT_PICK_FILENAME = 1; 28 29 protected void send(){ 30 String path = Environment.getExternalStorageDirectory().getPath(); 31 path = path + "/picturedir/picture.png"; 32 //文字列の取得 33 getRequestWithPOST(path);//POST 34 //Toast.makeText( this, picturePath, Toast.LENGTH_LONG).show(); 35 } 36 37 public void getRequestWithPOST(final String filePath) { 38 Log.d(TAG, filePath); 39 //Log.i(TAG,category); 40 41 new AsyncTask<Void, Void, String>() { 42 @Override 43 protected String doInBackground(Void... params) { 44 String result = null; 45 46 // リクエストボディを作る 47 final MediaType TEXT = MediaType.parse("text/plain; charset=utf-8"); 48 final MediaType IMAGE = MediaType.parse("image/png"); 49 50 final String BOUNDARY = String.valueOf(System.currentTimeMillis()); 51 52 RequestBody requestBody = new MultipartBody.Builder(BOUNDARY).setType(MultipartBody.FORM) 53 .addPart(Headers.of("Content-Disposition", "form-data; name=\"category\""), 54 RequestBody.create(TEXT, "IMAGE") 55 ) 56 .addFormDataPart("upfile", "upfile.png", RequestBody.create(IMAGE, new File(filePath))) 57 .build(); 58 59 // Content-Length の作成 不要ならいらない。okio.Buffer オブジェクトを利用。 60 Buffer buffer = new Buffer(); 61 String CONTENT_LENGTH; 62 try { 63 requestBody.writeTo(buffer); 64 CONTENT_LENGTH = String.valueOf(buffer.size()); 65 } catch (IOException e) { 66 e.printStackTrace(); 67 CONTENT_LENGTH = "-1"; 68 } finally { 69 buffer.close(); 70 } 71 72 73 // リクエストオブジェクトを作る。.post() 74 Request request = new Request.Builder() 75 .addHeader("Content-Length", CONTENT_LENGTH) 76 .url("送信先URL") 77 .post(requestBody) 78 .build(); 79 80 // クライアントオブジェクトを作る。 81 OkHttpClient client = new OkHttpClient(); 82 83 // 実行。リクエストして結果を受け取る。 84 try { 85 Response response = client.newCall(request).execute(); 86 result = response.body().string(); 87 88 } catch (IOException e) { 89 e.printStackTrace(); 90 } 91 92 // 返す 93 return result; 94 } 95 96 @Override 97 protected void onPostExecute(String result) { 98 mtextView.setText(result); 99 Log.d(TAG, result); 100 } 101 }.execute(); 102 } 103} 104
↓MainActivity.java
Java
1 2import android.os.Bundle; 3 4public class MainActivity extends subActivity { 5 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 11 send(); 12 } 13} 14 15
↓Projectsファイルの中のappの中のbuild.gradleのdependencies
post通信ではokhttp3のライブラリを使っています。
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:24.2.1' compile 'com.github.kevinsawicki:http-request:5.6' compile 'com.koushikdutta.ion:ion:2.+' compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.mcxiaoke.volley:library:1.0.19' compile 'com.loopj.android:android-async-http:1.4.9' }
↓Manifestに追加したpermission
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
###補足情報(言語/FW/ツール等のバージョンなど)
Android/AndroidStudio
###最後に…
Androidの開発を初めて半年程度の超初心者ですので、
専門的な知識が拙く変な文章の部分もあると思いますm(_ _)mすみません…
解決方法がお分かりの方は回答をお願いしますm(_ _)m
###追記
LogcutのErrorのログです。
09-16 20:10:17.049 32630-32710/com.m2cha.sendtest E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.m2cha.sendtest, PID: 32630
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:309)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.IllegalArgumentException: unexpected url: 送信先URL
at okhttp3.Request$Builder.url(Request.java:143)
at com.m2cha.sendtest.subActivity$1.doInBackground(subActivity.java:77)
at com.m2cha.sendtest.subActivity$1.doInBackground(subActivity.java:42)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
回答2件
あなたの回答
tips
プレビュー