質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.99%

AndroidStudioからサーバへのファイル送信で「問題が発生したため、~を終了します。」と出ます。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,295

m2cha

score 10

前提・実現したいこと

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 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 編集

    すみません、ごちゃごちゃしたので質問の本文を編集して
    最下部にもう一度書きます。

    キャンセル

回答 2

+1

エラーメッセージの通り、設定しているURLが「送信先URL」というわけのわからないURLを設定しているせいですね。
正しい送信先URLを設定しましょうね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/16 23:06

    実際には"送信先URL"ではなく、PHPのサーバのURLを設定しています。
    ですがアプリが落ちるんです…orz
    送信はできるんですが…アプリが落ちます。

    キャンセル

  • 2016/09/17 18:51

    使用しているライブラリをGitHubで見ると、不正なURLを渡すとエラーが出るようです。
    URLは一般的なものでしょうか。

    また、通信が発生している箇所は1箇所でしょうか。POST通信以外でもう1つ通信と取り違えていたりしませんか?

    キャンセル

  • 2016/09/21 12:10

    すみません、自己解決しました!

    キャンセル

check解決した方法

0

subActicityの
private TextView mtextView;と
mtextView.setText(result);を
コメントアウトしたらエラーが発生しないようになりました!
回答してくださった方、ありがとうございましたm(_ _)m

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • Javaに関する質問
  • AndroidStudioからサーバへのファイル送信で「問題が発生したため、~を終了します。」と出ます。