尝试发送图像的Andr​​oid应用程序崩溃应用程序、图像、Andr、oid

2023-09-09 21:09:06 作者:24.咿呀咿呀哟り

我有一个问题,而试图从我的应用程序发送图像到服务器。我知道它崩溃。 这些是我的文件:

RestClient.java

 包edu.gvsu.cis.masl.camerademo;

进口android.util.Log;
进口org.apache.http.HttpEntity;
进口org.apache.http.Htt presponse;
进口org.apache.http.client.HttpClient;
进口org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
进口org.apache.http.client.methods.HttpPut;
进口org.apache.http.client.methods.HttpUriRequest;
进口org.apache.http.entity.StringEntity;
进口org.apache.http.impl.client.DefaultHttpClient;
进口org.apache.http.params.BasicHttpParams;
进口org.apache.http.params.HttpConnectionParams;
进口org.apache.http.params.HttpParams;
进口org.apache.http.util.EntityUtils;
进口java.io.IOException异常;
进口java.io.UnsupportedEncodingException;


公共类RestClient {

私有静态最终诠释DEFAULT_CONNECTION_TIMEOUT = 30000;
私有静态最终诠释DEFAULT_RECEIVE_TIMEOUT = 60000;
//私有静态最后弦乐授权=授权;
私有静态最后弦乐CONTENT_TYPE =Content-Type的;
私有静态最后弦乐JSON_CONTENT_TYPE =应用/ JSON的;字符集= UTF-8;
私有静态最后弦乐UTF8 =UTF8;
私有静态最后弦乐DEBUG = RestClient.class.getName();


公开结果放(URL字符串,字符串JSON){
    返回executeRequest(新HttpPut(URL),JSON DEFAULT_RECEIVE_TIMEOUT);
}



民营结果executeRequest(HttpEntityEnclosingRequestBase要求,JSON字符串,INT超时){
    request.addHeader(CONTENT_TYPE,JSON_CONTENT_TYPE);
    尝试 {
        request.setEntity(新StringEntity(JSON,UTF8));
    }赶上(UnsupportedEncodingException E){
        Log.e(DEBUG,e.getMessage());
        返回Result.error();
    }
    返回executeRequest(请求超时);
}


民营结果executeRequest(HttpUriRequest要求,INT超时){

    INT响应code = -1;
    字符串responseContent = NULL;
    //request.addHeader(AUTHORIZATION,EN codeCredentials(userCredentials));
    的HttpParams的HttpParams =新BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(的HttpParams,DEFAULT_CONNECTION_TIMEOUT);
    HttpConnectionParams.setSoTimeout(的HttpParams,超时);
    HttpClient的客户端=新DefaultHttpClient(的HttpParams);

    尝试 {
        HTT presponse响应= client.execute(要求);
        HttpEntity实体= response.getEntity();
        。响应code = response.getStatusLine()的getStatus code();
        如果(实体!= NULL){
            responseContent = EntityUtils.toString(实体,UTF8);
        }

    }赶上(IOException异常E){
        Log.e(DEBUG,e.getMessage());
        返回Result.error();
    }
    返回新的结果(响应code,responseContent);
}


}
 

ImageDTO.java:

 公共类ImageDTO {

公共字符串ID;
公共字符串图像;

公共ImageDTO(ID字符串,字符串图像){
    this.id = ID;
    this.image =图像;
}
 

}

Result.java:

 包edu.gvsu.cis.masl.camerademo;

公共类结果{

公共静态最终诠释COMMUNICATION_ERROR = -1;
公共静态最终诠释OK_SUCCESS = 200;
公共静态最终诠释BAD_REQUEST = 400;
公共静态最终诠释未经授权= 401;
公共静态最终诠释NOT_FOUND = 404;
公共静态最终诠释INTERNAL_SERVER_ERROR = 500;

私人诠释响应code;
私人字符串resultContent;

公开结果(INT响应code,字符串resultContent){
    this.response code =响应code;
    this.resultContent = resultContent;
}

公众诠释GETRESPONSE code(){
    返回this.response code;
}

公共字符串getResultContent(){
    返回this.resultContent;
}

公共静态结果误差(){
    返回新的结果(COMMUNICATION_ERROR,ERROR);
}

}
 

和我的活动code与此相关的:

 字符串strBase64 = Base64.en codeToString(imageBytes,Base64.DEFAULT);
            INT ID = 1;

            ImageDTO imdto =新ImageDTO(Integer.toString(ID),strBase64);

            RestClient客户端=新RestClient();
            字符串jsonDTO =新GSON()的toJSON(imdto)。

            Log.i(巴勃罗,jsonDTO);
            结果结果= client.put(SERVICE_URL,jsonDTO);
            如果(result.getResponse code()= 200!)Log.i(****************,Oups水木清华哪里出了问题!!);
            其他Log.i(****************,响应= 200,连接已建立:D);
 

我的应用程序失败RestClient.java在这一行:

 的Htt presponse响应= client.execute(要求);
 

我不知道为什么会失败,因为RestClient和结果文件在其他项目中正常工作。

另外我不得不说的Base64 code是不完整的显示在IntelliJ IDEA的。如果我问了最新的字符,这是正确的,但不能显示在日志模式下所有的人。

这是日志显示失败:

  ERROR / AndroidRuntime(27028):致命异常:主要
    工艺:edu.gvsu.cis.masl.camerademo,PID:27028
    java.lang.RuntimeException的:不提供结果ResultInfo {谁= NULL,请求= 1888,结果= -1,数据= NULL}到活动{edu.gvsu.cis.masl.camerademo / edu.gvsu.cis.masl.camerademo .MyCameraActivity}:android.os.NetworkOnMainThreadException
    在android.app.ActivityThread.deliverResults(ActivityThread.java:3365)
    在android.app.ActivityThread.handleSendResult(ActivityThread.java:3408)
    在android.app.ActivityThread.access $ 1300(ActivityThread.java:135)
    在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1244)
    在android.os.Handler.dispatchMessage(Handler.java:102)
    在android.os.Looper.loop(Looper.java:136)
    在android.app.ActivityThread.main(ActivityThread.java:5017)
    在java.lang.reflect.Method.invokeNative(本机方法)
    在java.lang.reflect.Method.invoke(Method.java:515)
    在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)
    在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    在dalvik.system.NativeStart.main(本机方法)
    android.os.NetworkOnMainThreadException:产生的原因
    在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
    在java.net.InetAddress.lookupHostByName(InetAddress.java:385)
    在java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
    在java.net.InetAddress.getAllByName(InetAddress.java:214)
    在org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
    在org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    在org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    在org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    在edu.gvsu.cis.masl.camerademo.RestClient.executeRequest(RestClient.java:61)
    在edu.gvsu.cis.masl.camerademo.RestClient.executeRequest(RestClient.java:46)
    在edu.gvsu.cis.masl.camerademo.RestClient.put(RestClient.java:33)
    在edu.gvsu.cis.masl.camerademo.MyCameraActivity.onActivityResult(MyCameraActivity.java:78)
    在android.app.Activity.dispatchActivityResult(Activity.java:5423)
    在android.app.ActivityThread.deliverResults(ActivityThread.java:3361)
    ... 11更多
 

解决方案   

产生的原因:android.os.NetworkOnMainThreadException

原因: 唯一的例外,当应用程序试图在其主线程进行网络操作时所引发。

这是只抛出针对蜂窝SDK或更高版本的应用程序。针对早期SDK版本的应用程序可以做网络上的主要事件循环线程,但它严重阻碍。

NetworkOnMainThreadException 了解详情。

问题: 你是做网络相关的任务/操作主线程(UI线程)

解决方法: 它应该在工作线程来完成。 您可以使用的AsyncTask 在这种情况下所提供的机器人。 在 doInbackground 的方法的AsyncTask 执行所有与网络相关的任务。

注意: 您也可以使用 StrictMode

StrictMode 是一个开发工具,用于检测的事情,你可能会做意外,并将它们带给你的注意力,使你可以解决这些问题。

StrictMode 最常用来捕捉应用程序的主线程,在那里接收UI操作和动画发生在偶然的磁盘或网络访问。保持磁盘和网络操作在离主线程使得更平滑,反应更灵敏的应用程序。通过保持你的应用程序的主线程响应,也prevent ANR对话框被显示给用户。

StrictMode 了解详情。

I have a problem while trying to send an image from my app to the server. I know where it crashes. These are my files:

RestClient.java

package edu.gvsu.cis.masl.camerademo;

import android.util.Log;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.io.UnsupportedEncodingException;


public class RestClient {

private static final int DEFAULT_CONNECTION_TIMEOUT = 30000;
private static final int DEFAULT_RECEIVE_TIMEOUT = 60000;
//private static final String AUTHORIZATION = "Authorization";
private static final String CONTENT_TYPE = "Content-Type";
private static final String JSON_CONTENT_TYPE = "application/json; charset=utf-8";
private static final String UTF8 = "UTF8";
private static final String DEBUG = RestClient.class.getName();


public Result put(String url, String json) {
    return executeRequest(new HttpPut(url), json, DEFAULT_RECEIVE_TIMEOUT);
}



private Result executeRequest(HttpEntityEnclosingRequestBase request, String json, int timeout) {
    request.addHeader(CONTENT_TYPE, JSON_CONTENT_TYPE);
    try {
        request.setEntity(new StringEntity(json,UTF8));
    }catch(UnsupportedEncodingException e) {
        Log.e(DEBUG, e.getMessage());
        return Result.error();
    }
    return executeRequest(request,timeout);
}


private Result executeRequest(HttpUriRequest request, int timeout) {

    int responseCode = -1;
    String responseContent = null;
    //request.addHeader(AUTHORIZATION, encodeCredentials(userCredentials));
    HttpParams httpParams = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(httpParams, DEFAULT_CONNECTION_TIMEOUT);
    HttpConnectionParams.setSoTimeout(httpParams, timeout);
    HttpClient client = new DefaultHttpClient(httpParams);

    try {
        HttpResponse response = client.execute(request);
        HttpEntity entity = response.getEntity();
        responseCode = response.getStatusLine().getStatusCode();
        if(entity!=null) {
            responseContent = EntityUtils.toString(entity, UTF8);
        }

    }catch(IOException e) {
        Log.e(DEBUG, e.getMessage());
        return Result.error();
    }
    return new Result(responseCode, responseContent);
}


}

ImageDTO.java:

public class ImageDTO {

public String id;
public String image;

public ImageDTO(String id, String image) {
    this.id = id;
    this.image=image;
}

}

Result.java:

package edu.gvsu.cis.masl.camerademo;

public class Result {

public static final int COMMUNICATION_ERROR = -1;
public static final int OK_SUCCESS = 200;
public static final int BAD_REQUEST = 400;
public static final int UNAUTHORIZED = 401;
public static final int NOT_FOUND = 404;
public static final int INTERNAL_SERVER_ERROR = 500;

private int responseCode;
private String resultContent;

public Result(int responseCode, String resultContent) {
    this.responseCode = responseCode;
    this.resultContent = resultContent;
}

public int getResponseCode() {
    return this.responseCode;
}

public String getResultContent() {
    return this.resultContent;
}

public static Result error() {
    return new Result(COMMUNICATION_ERROR, "ERROR");
}

}

And the code in my activity related to this:

String strBase64 = Base64.encodeToString(imageBytes, Base64.DEFAULT);
            int id = 1;

            ImageDTO imdto = new ImageDTO(Integer.toString(id), strBase64);

            RestClient client = new RestClient();
            String jsonDTO = new Gson().toJson(imdto);

            Log.i("Pablo", jsonDTO);
            Result result = client.put(SERVICE_URL, jsonDTO);
            if (result.getResponseCode() != 200) Log.i("****************", "Oups! Smth went wrong!!!");
            else Log.i("****************", "Response = 200 , Connection Established :D");

My app fails in RestClient.java in this line:

HttpResponse response = client.execute(request);

I don't know why it fails because the RestClient and Result files works fine in other project.

Also I have to say that Base64 code is not complete displayed in IntelliJ Idea. If I ask about the latest char, it is the correct one but it cannot display all of them in log mode.

This is the log showing the fail:

ERROR/AndroidRuntime(27028): FATAL EXCEPTION: main
    Process: edu.gvsu.cis.masl.camerademo, PID: 27028
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1888, result=-1, data=null} to activity {edu.gvsu.cis.masl.camerademo/edu.gvsu.cis.masl.camerademo.MyCameraActivity}: android.os.NetworkOnMainThreadException
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3365)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3408)
    at android.app.ActivityThread.access$1300(ActivityThread.java:135)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5017)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
    at java.net.InetAddress.getAllByName(InetAddress.java:214)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    at edu.gvsu.cis.masl.camerademo.RestClient.executeRequest(RestClient.java:61)
    at edu.gvsu.cis.masl.camerademo.RestClient.executeRequest(RestClient.java:46)
    at edu.gvsu.cis.masl.camerademo.RestClient.put(RestClient.java:33)
    at edu.gvsu.cis.masl.camerademo.MyCameraActivity.onActivityResult(MyCameraActivity.java:78)
    at android.app.Activity.dispatchActivityResult(Activity.java:5423)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3361)
    ... 11 more

解决方案

Caused by: android.os.NetworkOnMainThreadException

Reason : The exception that is thrown when an application attempts to perform a networking operation on its main thread.

This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged.

Refer NetworkOnMainThreadException for more information.

Problem : You are doing a network related task/operation in Main thread (UI thread).

Solution: It should be done in a worker thread . You can use AsyncTask provided by android in this situation. Perform all the network related task in doInbackground method of AsyncTask.

Note : You can also make use of StrictMode.

StrictMode is a developer tool which detects things you might be doing by accident and brings them to your attention so you can fix them.

StrictMode is most commonly used to catch accidental disk or network access on the application's main thread, where UI operations are received and animations take place. Keeping disk and network operations off the main thread makes for much smoother, more responsive applications. By keeping your application's main thread responsive, you also prevent ANR dialogs from being shown to users.

Refer StrictMode for more information.

 
精彩推荐
图片推荐