Androidがカメラから画像をアップロードすると、アプリケーションがクラッシュします

theUturn

ギャラリーとカメラから画像をアップロードしようとしていますが、ギャラリー画像のアップロードには完全に機能しますが、http400ステータスのカメラから画像をアップロードしようとするとクラッシュします//インテントを開く方法

private void openImageIntent() {

    // Determine Uri of camera image to save.
    final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyDir" + File.separator);
    root.mkdirs();
    final String fname = "thisFile";
    final File sdImageMainDirectory = new File(root, fname);
    outputFileUri = Uri.fromFile(sdImageMainDirectory);

    // Camera.
    final List<Intent> cameraIntents = new ArrayList<Intent>();
    final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    final PackageManager packageManager = getPackageManager();
    final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
    for(ResolveInfo res : listCam) {
        final String packageName = res.activityInfo.packageName;
        final Intent intent = new Intent(captureIntent);
        intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
        intent.setPackage(packageName);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        cameraIntents.add(intent);
    }

    // Filesystem.
    final Intent galleryIntent = new Intent();
    galleryIntent.setType("image/* video/*");
    galleryIntent.setAction(Intent.ACTION_PICK);

    final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");

    // Add the camera options.
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()]));

    startActivityForResult(chooserIntent, 1);
}

// onActivity結果メソッド

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == 1) {
            final boolean isCamera;
            if (data == null) {
                isCamera = true;
            } else {
                final String action = data.getAction();
                if (action == null) {
                    isCamera = false;
                } else {
                    isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                }
            }


            if (isCamera) {

                selectedImageUri = outputFileUri;
                //  Toast.makeText(UpdateProfileActivity.this,selectedImageUri+"",Toast.LENGTH_SHORT).show();
                System.out.println("-------camera---------------------"+selectedImageUri);

                File myFile = new File(selectedImageUri.getPath());
                myFile.getAbsolutePath();
                this.file_path= myFile.getAbsolutePath();
                System.out.println("-------file_path---------------------"+file_path);
                uploadFile();
            } else {
                selectedImageUri = data == null ? null : data.getData();
               // Toast.makeText(LiveChatActivity.this,selectedImageUri+"",Toast.LENGTH_SHORT).show();
                Uri selectedImage = data.getData();
                String[] filePathColumn = {MediaStore.Images.Media.DATA};

                Cursor cursor = getContentResolver().query(
                        selectedImage, filePathColumn, null, null, null);
                cursor.moveToFirst();

                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                String filePath = cursor.getString(columnIndex);
                this.file_path=filePath;

                uploadFile();
            }
        }

    }
}

//ファイルをアップロードする方法

 public void uploadFile(){
    SharedPreferences sf = LiveChatActivity.this.getSharedPreferences("all", 0);

    String reqUrl = ApiUrls.getEventDetails + "/comments";     
    HashMap<String, String> formValues = new HashMap<>();
    formValues.put("comment_post_ID", event_id);
    formValues.put("comment_author", "ves");//sf.getString("display_name", "comment_author")
    formValues.put("comment_author_email", sf.getString("user_email", "user_email"));
    formValues.put("comment_content", comment_content);
    formValues.put("user_id", sf.getString("user_id", "user_id"));
    formValues.put("file", this.file_path);
    HashMap<String, String> fileValues = new HashMap<String, String>();
    fileValues.put("file", this.file_path);  
    WebServiceUtil wUtil = new WebServiceUtil(LiveChatActivity.this, reqUrl, formValues, true, fileValues);
    wUtil.execute();
}

画像と一緒にいくつかの文字列パラメータを送信するためにHTTPマルチパートリクエストボディをまとめる方法のwebservice.javaユーティリティ

public class WebServiceUtil extends AsyncTask<String, Integer, String> {

HashMap<String, String> formValues;
HashMap<String, String> fileValues;

Boolean uploadFile;
String reqUrl;
String result;
ProgressDialog dialog;
Context context;

public WebServiceUtil(Context context, String reqUrl,
                      HashMap<String, String> formValues, Boolean uploadFile,
                      HashMap<String, String> fileValues) {

    this.context = context;
    this.reqUrl = reqUrl;
    this.formValues = formValues;

    this.uploadFile = uploadFile;
    if (uploadFile) {

        this.fileValues = fileValues;
    }
}

@Override
protected void onPreExecute() {

    super.onPreExecute();

}

//

@Override
protected String doInBackground(String... URLs) {

    List<String> response = null;
    try {
        MultipartUtility mu = new MultipartUtility(context, reqUrl, "UTF-8");

        for (Map.Entry<String, String> entry : formValues.entrySet()) {
            String key = entry.getKey();

            String value = entry.getValue();

            mu.addFormField(key, value);

        }

        if (uploadFile) {


            for (Map.Entry<String, String> entry : fileValues.entrySet()) {
                String key = entry.getKey();

                String value = entry.getValue();


                File file =new File(value);
                mu.addFilePart(key, file);

            }

        }

        response = mu.finish();

    } catch (IOException e) {

        e.printStackTrace();
    }

    return response.toString();

}

protected void onPostExecute(String result) {


}
}

codejava.netから適応されたMultipartUtility.java

/**
 * This utility class provides an abstraction layer for sending multipart HTTP
 * POST requests to a web server. 
 * @author www.codejava.net
 *
 */
public class MultipartUtility {
private final String boundary;
private static final String LINE_FEED = "\r\n";
private HttpURLConnection httpConn;
private String charset;
private OutputStream outputStream;
private PrintWriter writer;
ProgressDialog dialog;

/**
 * This constructor initializes a new HTTP POST request with content type
 * is set to multipart/form-data
 * @param requestURL
 * @param charset
 * @throws IOException
 */
public MultipartUtility(Context context,String requestURL, String charset)
        throws IOException {
    //dialog = new ProgressDialog(context);
    this.charset = charset;

    // creates a unique boundary based on time stamp
    boundary = "===" + System.currentTimeMillis() + "===";

    URL url = new URL(requestURL);
    httpConn = (HttpURLConnection) url.openConnection();
    httpConn.setUseCaches(false);
    httpConn.setDoOutput(true); // indicates POST method
    httpConn.setDoInput(true);
    SharedPreferences sf=context.getSharedPreferences("all", 0);
    String authToken=sf.getString("authToken","");

    httpConn.setRequestProperty("authToken", authToken);
    httpConn.setRequestProperty("Content-Type",
            "multipart/form-data; boundary=" + boundary);
    httpConn.setRequestProperty("User-Agent", "CodeJava Agent");
    httpConn.setRequestProperty("Test", "Bonjour");
    outputStream = httpConn.getOutputStream();
    writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
            true);
}

/**
 * Adds a form field to the request
 * @param name field name
 * @param value field value
 */
public void addFormField(String name, String value) {
    writer.append("--" + boundary).append(LINE_FEED);
    writer.append("Content-Disposition: form-data; name=\"" + name + "\"")
            .append(LINE_FEED);
    writer.append("Content-Type: text/plain; charset=" + charset).append(
            LINE_FEED);
    writer.append(LINE_FEED);
    writer.append(value).append(LINE_FEED);
    writer.flush();
}

/**
 * Adds a upload file section to the request
 * @param fieldName name attribute in <input type="file" name="..." />
 * @param uploadFile a File to be uploaded
 * @throws IOException
 */
public void addFilePart(String fieldName, File uploadFile)
        throws IOException {
    String fileName = uploadFile.getName();
    writer.append("--" + boundary).append(LINE_FEED);
    writer.append(
            "Content-Disposition: form-data; name=\"" + fieldName
                    + "\"; filename=\"" + fileName + "\"")
            .append(LINE_FEED);
    writer.append(
            "Content-Type: "
                    + URLConnection.guessContentTypeFromName(fileName))
            .append(LINE_FEED);
    writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
    writer.append(LINE_FEED);
    writer.flush();

    FileInputStream inputStream = new FileInputStream(uploadFile);
    byte[] buffer = new byte[4096];
    int bytesRead = -1;
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        outputStream.write(buffer, 0, bytesRead);
    }
    outputStream.flush();
    inputStream.close();

    writer.append(LINE_FEED);
    writer.flush();
}

/**
 * Adds a header field to the request.
 * @param name - name of the header field
 * @param value - value of the header field
 */
public void addHeaderField(String name, String value) {
    writer.append(name + ": " + value).append(LINE_FEED);
    writer.flush();
}

/**
 * Completes the request and receives response from the server.
 * @return a list of Strings as response in case the server returned
 * status OK, otherwise an exception is thrown.
 * @throws IOException
 */
public List<String> finish() throws IOException {


    List<String> response = new ArrayList<String>();

    writer.append(LINE_FEED).flush();
    writer.append("--" + boundary + "--").append(LINE_FEED);
    writer.close();

    // checks server's status code first
    int status = httpConn.getResponseCode();
    if (status == HttpURLConnection.HTTP_OK) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                httpConn.getInputStream()));
        String line = null;
        while ((line = reader.readLine()) != null) {
            response.add(line);
        }
        reader.close();
        httpConn.disconnect();
    } else {
        throw new IOException("Server returned non-OK status: " + status);
    }


    return response;
}



}

//クラッシュログ

04-07 10:19:51.069 32014-32157/eaglevision.tellmeelive W/System.err: java.io.IOException: Server returned non-OK status: 400
04-07 10:19:51.079 32014-32157/eaglevision.tellmeelive W/System.err:     at eaglevision.tellmeelive.api.MultipartUtility.finish(MultipartUtility.java:165)
04-07 10:19:51.079 32014-32157/eaglevision.tellmeelive W/System.err:     at eaglevision.tellmeelive.api.WebServiceUtil.doInBackground(WebServiceUtil.java:89)
04-07 10:19:51.079 32014-32157/eaglevision.tellmeelive W/System.err:     at eaglevision.tellmeelive.api.WebServiceUtil.doInBackground(WebServiceUtil.java:22)
04-07 10:19:51.079 32014-32157/eaglevision.tellmeelive W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:292)
04-07 10:19:51.079 32014-32157/eaglevision.tellmeelive W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
04-07 10:19:51.079 32014-32157/eaglevision.tellmeelive W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
04-07 10:19:51.079 32014-32157/eaglevision.tellmeelive W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
04-07 10:19:51.079 32014-32157/eaglevision.tellmeelive W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
04-07 10:19:51.079 32014-32157/eaglevision.tellmeelive W/System.err:     at java.lang.Thread.run(Thread.java:818)
theUturn

私はファイル拡張子を追加しました、そしてそれは働きました

最初の関数で置き換えました===> final String fname = "thisFile"; 最終的な文字列fname = "thisFile.jpg";

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

URLから画像を取得してAndroidアプリケーションに表示するアプリケーションがクラッシュする

分類Dev

onPostExecute(...)メソッドのフィールドを更新しようとすると、Androidアプリケーションがクラッシュします

分類Dev

メインスレッドのプログレスバーをワーカースレッドから更新してもAndroidアプリケーションがクラッシュしない場合があります

分類Dev

ダイアログをロードすると、Androidアプリケーションがクラッシュします

分類Dev

Androidアプリケーションのスプラッシュ画面を開くと、アプリケーションがクラッシュします

分類Dev

フラグメントがプロジェクトに追加されると、Androidアプリケーションがクラッシュします

分類Dev

スピナーからアイテムを取得すると、アプリケーションがクラッシュします-android

分類Dev

OSX Sierraのドックからアクティブなアプリケーションを非表示にしようとしていますが、実行していることでアプリケーションがクラッシュします

分類Dev

FirebaseデータのアップロードがクラッシュするAndroidアプリケーション

分類Dev

ピカソが写真をダウンロードせず、アプリケーションがクラッシュすることがあります

分類Dev

非同期メソッドからアプリケーションがクラッシュする

分類Dev

Android:APKをリリースした後(リリースモードで)、アプリケーションでカメラモデルを開いたとき。アプリがクラッシュしますか?

分類Dev

countdowntimerが終了する前にフラグメントを変更すると、Androidでアプリケーションがクラッシュします

分類Dev

arraylistに大量のビットマップをロードすると、アプリケーションがクラッシュします

分類Dev

カメラから画像を取得しているときにサムスンデバイスでのみAndroidアプリケーションがクラッシュする

分類Dev

KitKat 4.4.4 API19でretrofitを使用して画像をアップロード中にアプリケーションがクラッシュする

分類Dev

Android:Firebaseからオブジェクトを読み取ると、アプリケーションがクラッシュします

分類Dev

Toastを表示しようとすると、アプリケーションがクラッシュします

分類Dev

画像ファイルをエクスプローラーからアプリケーションにドラッグアンドドロップします

分類Dev

フラグメントのロード時にアプリケーションがクラッシュする

分類Dev

アニメーションを呼び出すとアプリがクラッシュしますか?

分類Dev

アプリケーションがバックグラウンドプロセスからiOSのアクティブプロセスに移行するときに、編集可能なアラートビューを表示します

分類Dev

Androidカスタムカメラアプリケーションが「不幸にも停止」して起動するとクラッシュする

分類Dev

メニューボタンを押すとアプリケーションがクラッシュする

分類Dev

Androidでgridviewを使用しているときにアプリケーションがクラッシュする

分類Dev

Tempdataを使用するとアプリケーションがクラッシュします

分類Dev

CursorAdapterを使用すると、アプリケーションがクラッシュします

分類Dev

deinitに.removeStateDidListenerを追加すると、アプリケーションがクラッシュします

分類Dev

UserDefaults(Swift)から色をロードすると、起動時にアプリがクラッシュします

Related 関連記事

  1. 1

    URLから画像を取得してAndroidアプリケーションに表示するアプリケーションがクラッシュする

  2. 2

    onPostExecute(...)メソッドのフィールドを更新しようとすると、Androidアプリケーションがクラッシュします

  3. 3

    メインスレッドのプログレスバーをワーカースレッドから更新してもAndroidアプリケーションがクラッシュしない場合があります

  4. 4

    ダイアログをロードすると、Androidアプリケーションがクラッシュします

  5. 5

    Androidアプリケーションのスプラッシュ画面を開くと、アプリケーションがクラッシュします

  6. 6

    フラグメントがプロジェクトに追加されると、Androidアプリケーションがクラッシュします

  7. 7

    スピナーからアイテムを取得すると、アプリケーションがクラッシュします-android

  8. 8

    OSX Sierraのドックからアクティブなアプリケーションを非表示にしようとしていますが、実行していることでアプリケーションがクラッシュします

  9. 9

    FirebaseデータのアップロードがクラッシュするAndroidアプリケーション

  10. 10

    ピカソが写真をダウンロードせず、アプリケーションがクラッシュすることがあります

  11. 11

    非同期メソッドからアプリケーションがクラッシュする

  12. 12

    Android:APKをリリースした後(リリースモードで)、アプリケーションでカメラモデルを開いたとき。アプリがクラッシュしますか?

  13. 13

    countdowntimerが終了する前にフラグメントを変更すると、Androidでアプリケーションがクラッシュします

  14. 14

    arraylistに大量のビットマップをロードすると、アプリケーションがクラッシュします

  15. 15

    カメラから画像を取得しているときにサムスンデバイスでのみAndroidアプリケーションがクラッシュする

  16. 16

    KitKat 4.4.4 API19でretrofitを使用して画像をアップロード中にアプリケーションがクラッシュする

  17. 17

    Android:Firebaseからオブジェクトを読み取ると、アプリケーションがクラッシュします

  18. 18

    Toastを表示しようとすると、アプリケーションがクラッシュします

  19. 19

    画像ファイルをエクスプローラーからアプリケーションにドラッグアンドドロップします

  20. 20

    フラグメントのロード時にアプリケーションがクラッシュする

  21. 21

    アニメーションを呼び出すとアプリがクラッシュしますか?

  22. 22

    アプリケーションがバックグラウンドプロセスからiOSのアクティブプロセスに移行するときに、編集可能なアラートビューを表示します

  23. 23

    Androidカスタムカメラアプリケーションが「不幸にも停止」して起動するとクラッシュする

  24. 24

    メニューボタンを押すとアプリケーションがクラッシュする

  25. 25

    Androidでgridviewを使用しているときにアプリケーションがクラッシュする

  26. 26

    Tempdataを使用するとアプリケーションがクラッシュします

  27. 27

    CursorAdapterを使用すると、アプリケーションがクラッシュします

  28. 28

    deinitに.removeStateDidListenerを追加すると、アプリケーションがクラッシュします

  29. 29

    UserDefaults(Swift)から色をロードすると、起動時にアプリがクラッシュします

ホットタグ

アーカイブ