这不是一个真正的问题,但是,我想在这里分享一些我的工作代码供您参考.
据我们所知,HttpEntity
API22已弃用,自API23以来已完全删除.目前,我们无法再访问Android Developer上的HttpEntity Reference(404).因此,以下是我使用Volley和没有HttpEntity的POST多部分请求的工作示例代码.它正在运行,经过测试Asp.Net Web API
.当然,代码可能只是发布两个现有可绘制文件的基本示例,也不是所有情况下的最佳解决方案,也不是很好的调优.
MultipartActivity.java:
package com.example.multipartvolley;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import com.android.volley.NetworkResponse;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public class MultipartActivity extends Activity {
private final Context context = this;
private final String twoHyphens = "--";
private final String lineEnd = "\r\n";
private final String boundary = …
Run Code Online (Sandbox Code Playgroud) 我正在尝试从经过身份验证的用户(使用Firebase身份验证)检索Google Access令牌以访问Google REST API,例如YouTube Data API.
我已经在Firebase-UI for Android - Auth库的帮助下成功地在我的应用中集成了Google登录.从FirebaseUser.getToken()
方法检索的令牌不是REST API的有效Google Access令牌.
user.getToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
public void onComplete(@NonNull Task<GetTokenResult> task) {
if (task.isSuccessful()) {
String token = task.getResult().getToken();
// 'token' is not a Google Access Token
}
}
});
Run Code Online (Sandbox Code Playgroud)
在Google Sign-In for Web指南中,可以通过调用获取访问令牌var token = result.credential.accessToken;
,但我在Android中找不到类似的方法.
有什么投入?如果我没有提供足够的信息,请在这里发表评论.谢谢 :)
我正在关注Google登录Android版.现在我可以获得idToken,但我之前使用的后端服务器期待访问令牌,因为我之前使用的是Google+登录.现在我不想改变我的服务器端.但我仍然可以如何使用Google登录并在我的Android应用程序中获取访问令牌,以便我可以将我的用户验证到我的后端服务器.
我之前使用的是GooglePlay Service 7.5.0,现在我正在使用GooglePlay Service最新的8.3.0.
android google-play-services android-googleapiclient google-signin
我正在尝试使用Retrofit2在服务器上发送文件.我根据文档做了一切,但总是得到400服务器错误.
我试图这样做:
RequestBody body =
RequestBody.create(MediaType.parse("image/png"), photo);
//..........
@Multipart
@POST(ADD_PHOTO)
Observable<HPSPhotoResponse>
addPhoto(@Part("file") RequestBody file);
Run Code Online (Sandbox Code Playgroud)
......并且像这样:
MultipartBody.Part part = MultipartBody.Part.createFormData("file", "file", body);
//...........
@Multipart
@POST(ADD_PHOTO)
Observable<HPSPhotoResponse>
addPhoto(@Part("file") MultipartBody.Part files);
Run Code Online (Sandbox Code Playgroud)
无所谓 结果始终相同"多部分请求:不存在所需的MultipartFile参数'文件'" - 服务器响应.
我认为服务器上的Spring工作不好,但是我在Swift(iOS)上做了相同的代码而且它有效!这里服务器看到这个'文件'部分.
Alamofire.upload(method, endpoint, headers: headers,
multipartFormData: { multipartFormData in
multipartFormData.appendBodyPart(fileURL: self.filePath!, name: "file")
}
Run Code Online (Sandbox Code Playgroud)
现在我希望它可以在Android上使用Retrofit.但我甚至查看了Retrofit请求的日志,实际上我在日志中看不到任何"文件"文本.
这有什么问题?
正如我们所知,Apache HTTP Client
已在API 23中删除
但是,Volley
库目前仍然使用Apache
的库如
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.StatusLine;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.impl.cookie.DateUtils;
Run Code Online (Sandbox Code Playgroud)
我测试了2个项目:一个用于compileSdkVersion 22
,另一个用于compileSdkVersion 23
获得2个截图:
compileSdkVersion 22
compileSdkVersion 23
我有两个问题:
Apache
在运行时使用该库,他们是在API22或更低版本中找到的?Apache
图书馆吗?如果没有,当Apache
我的图书馆完全删除并且不受支持时,我现在的项目是否仍会继续使用?也许我的英语不太清楚,但希望你能理解我的问题.
任何解释将不胜感激.
更新:
从@ random的评论中,我使用谷歌的官方Volley库创建了一个新的API23项目(我的意思git clone https://android.googlesource.com/platform/frameworks/volley
是谷歌建议的这里),而不是compile 'com.mcxiaoke.volley:library:1.0.17'
在build.gradle
文件中使用.是的,在构建项目时因缺少Apache库而出错.必须按文档添加useLibrary 'org.apache.http.legacy'
到build.gradle
文件中.
第二次更新:
我刚刚定制了谷歌的排球(作为我项目中的一个模块),删除了Apache库.请转到我的GitHub示例项目供您参考.但请注意,它尚未针对所有情况进行全面测试,并且我仅测试了02个简单案例:GET
并且POST
我的Web服务请求是ASP.NET Web …
apache android httpresponse android-volley android-api-levels
目前,我的应用正在使用
我使用以下代码来执行GoogleApiClient
连接.
public class GoogleApiClientFragment extends Fragment implements
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
public interface ConnectionCallbacks {
void onConnected(GoogleApiClient googleApiClient, int action);
void onCancel(int action);
}
public static GoogleApiClientFragment newInstance(String accountName, int action) {
GoogleApiClientFragment googleApiClientFragment = new GoogleApiClientFragment();
Bundle bundle = new Bundle();
bundle.putString(INTENT_EXTRA_ACCOUNT_NAME, accountName);
bundle.putInt(INTENT_EXTRA_ACTION, action);
googleApiClientFragment.setArguments(bundle);
return googleApiClientFragment;
}
/**
* Handles resolution callbacks.
*/
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent data) {
super.onActivityResult(requestCode, resultCode, data); …
Run Code Online (Sandbox Code Playgroud) 试图从登录的个人资料中获取照片.但总是返回null.姓名和电子邮件返回值,只有照片有问题.
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestProfile()
.requestEmail()
.build();
mGoogleApiClient = new GoogleApiClient.Builder(StartActivity.this)
.enableAutoManage(StartActivity.this, StartActivity.this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
acct = gResult.getSignInAccount();
String name = acct.getDisplayName(); //okay, value != null
String email = acct.getEmail(); //okay, value != null
Uri photoUri = acct.getPhotoUrl() //not okay, value == null
Run Code Online (Sandbox Code Playgroud)
为什么会这样?帐户已签名,电子邮件和姓名已获得,但照片始终失败.
我正在尝试使用OkHTTP库.调用服务器并获得成功响应时.我需要更新UI.
使用enqueue()进行异步调用时如何才能完成?
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(Response response) throws IOException {
if (response.isSuccessful()) {
// NEED TO UPDATE UI HERE
}
}
});
Run Code Online (Sandbox Code Playgroud) 使用Retrofit 2.0.1,我在Android App中定义的API接口中有一个调用函数:
@Multipart
@POST("api.php")
Call<ResponseBody> doAPI(
@Part("lang") String lang,
@Part("file\"; filename=\"image.jpg") RequestBody file
);
Run Code Online (Sandbox Code Playgroud)
我发送这样的请求:
Call call = service.doAPI("eng",imageFile);
其中imageFile
是一个RequestBody
与创建File
对象.上传图片部分没有问题,而@Part("lang") String lang
部分在服务器中得到额外的报价.
在PHP方面,它写如下:
$lang = trim($_POST['lang']);
Run Code Online (Sandbox Code Playgroud)
返回"eng"
.为什么在字符串周围有一个额外的双引号?
当然我可以删除尾随和引导双引号,但这样做很奇怪
我一直在为AutoCompleteTextView创建自定义ArrayAdapter时遇到困难,尽管在互联网上找到以下代码,但仍会出现这样的错误:
因此,对于那些遇到或遇到与我相同问题的人,我建议使用BaseAdapter代替AutoCompleteTextView.
android autocompletetextview android-arrayadapter baseadapter
android ×10
multipart ×2
retrofit2 ×2
apache ×1
baseadapter ×1
google-login ×1
httpentity ×1
httpresponse ×1
java ×1
okhttp ×1
php ×1
retrofit ×1