前提・実現したいこと
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
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
import android.widget.TextView;
import java.io.File;
import java.io.IOException;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okio.Buffer;
/**
* Created by m2cha on 2016/09/16.
*/
public class subActivity extends Activity {
private String TAG = "Activity";
private TextView mtextView;
int RESULT_PICK_FILENAME = 1;
protected void send(){
String path = Environment.getExternalStorageDirectory().getPath();
path = path + "/picturedir/picture.png";
//文字列の取得
getRequestWithPOST(path);//POST
//Toast.makeText( this, picturePath, Toast.LENGTH_LONG).show();
}
public void getRequestWithPOST(final String filePath) {
Log.d(TAG, filePath);
//Log.i(TAG,category);
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
String result = null;
// リクエストボディを作る
final MediaType TEXT = MediaType.parse("text/plain; charset=utf-8");
final MediaType IMAGE = MediaType.parse("image/png");
final String BOUNDARY = String.valueOf(System.currentTimeMillis());
RequestBody requestBody = new MultipartBody.Builder(BOUNDARY).setType(MultipartBody.FORM)
.addPart(Headers.of("Content-Disposition", "form-data; name=\"category\""),
RequestBody.create(TEXT, "IMAGE")
)
.addFormDataPart("upfile", "upfile.png", RequestBody.create(IMAGE, new File(filePath)))
.build();
// Content-Length の作成 不要ならいらない。okio.Buffer オブジェクトを利用。
Buffer buffer = new Buffer();
String CONTENT_LENGTH;
try {
requestBody.writeTo(buffer);
CONTENT_LENGTH = String.valueOf(buffer.size());
} catch (IOException e) {
e.printStackTrace();
CONTENT_LENGTH = "-1";
} finally {
buffer.close();
}
// リクエストオブジェクトを作る。.post()
Request request = new Request.Builder()
.addHeader("Content-Length", CONTENT_LENGTH)
.url("送信先URL")
.post(requestBody)
.build();
// クライアントオブジェクトを作る。
OkHttpClient client = new OkHttpClient();
// 実行。リクエストして結果を受け取る。
try {
Response response = client.newCall(request).execute();
result = response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
// 返す
return result;
}
@Override
protected void onPostExecute(String result) {
mtextView.setText(result);
Log.d(TAG, result);
}
}.execute();
}
}
↓MainActivity.java
import android.os.Bundle;
public class MainActivity extends subActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
send();
}
}
↓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)
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
エラーメッセージの通り、設定しているURLが「送信先URL」というわけのわからないURLを設定しているせいですね。
正しい送信先URLを設定しましょうね。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
check解決した方法
0
subActicityの
private TextView mtextView;と
mtextView.setText(result);を
コメントアウトしたらエラーが発生しないようになりました!
回答してくださった方、ありがとうございましたm(_ _)m
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.99%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
yona
2016/09/16 19:52
エラーログを追記してください。
m2cha
2016/09/16 20:13 編集
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)
m2cha
2016/09/16 20:14 編集
すみません、ごちゃごちゃしたので質問の本文を編集して
最下部にもう一度書きます。