作者:uai_128366833952 | 来源:互联网 | 2023-05-21 19:05
如何解决《java.lang.NoSuchFieldError:org.apache.http.message.BasicHeaderValueFormatter.INSTANCEandroid》经验,为你挑选了1个好方法。
尝试使用以下代码上传大型视频,但收到此错误<java.lang.NoSuchFieldError: org.apache.http.message.BasicHeaderValueFormatter.INSTANCE
>.我猜它是由于多个类路径而发生的,但是如何在eclipse中纠正.为此,我使用了http://hc.apache.org/downloads.cgi
.have中的jar文件,仅包含httpclient-4.4.jar,httpcore-4.4.jar,httpsime-4.4.jar.
public class MainActivity extends ActionBarActivity {
int SELECT_VIDEO = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setType("video/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select a Video "), SELECT_VIDEO);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == SELECT_VIDEO) {
System.out.println("SELECT_VIDEO");
Uri selectedVideoUri = data.getData();
String selectedPath = getPath(selectedVideoUri);
System.out.println("SELECT_VIDEO Path : " + selectedPath);
try {
uploadVideo(selectedPath);
} catch (ParseException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private String getPath(Uri uri) {
String[] projection = { MediaStore.Video.Media.DATA, MediaStore.Video.Media.SIZE, MediaStore.Video.Media.DURATION};
Cursor cursor = managedQuery(uri, projection, null, null, null);
cursor.moveToFirst();
String filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));
int fileSize = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE));
long duration = TimeUnit.MILLISECONDS.toSeconds(cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION)));
return filePath;
}
@SuppressWarnings("deprecation")
private void uploadVideo(String videoPath) throws ParseException, IOException {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("URL");
FileBody filebodyVideo = new FileBody(new File(videoPath));
StringBody title = new StringBody("Filename: " + videoPath);
StringBody description = new StringBody("This is a description of the video");
MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart("videoFile", filebodyVideo);
reqEntity.addPart("title", title);
reqEntity.addPart("description", description);
httppost.setEntity(reqEntity);
// DEBUG
System.out.println( "executing request " + httppost.getRequestLine( ) );
HttpResponse respOnse= httpclient.execute( httppost );
HttpEntity resEntity = response.getEntity( );
// DEBUG
System.out.println( response.getStatusLine( ) );
if (resEntity != null) {
System.out.println( EntityUtils.toString( resEntity ) );
} // end if
if (resEntity != null) {
resEntity.consumeContent( );
} // end if
httpclient.getConnectionManager( ).shutdown( );
} // end of uploadVideo( )
}
logcat的:
02-16 14:16:18.421: E/AndroidRuntime(20632): Process: com.example.testingandroid, PID: 20632
02-16 14:16:18.421: E/AndroidRuntime(20632): java.lang.NoSuchFieldError: org.apache.http.message.BasicHeaderValueFormatter.INSTANCE
02-16 14:16:18.421: E/AndroidRuntime(20632): at org.apache.http.entity.ContentType.toString(ContentType.java:153)
02-16 14:16:18.421: E/AndroidRuntime(20632): at org.apache.http.entity.mime.MultipartFormEntity.(MultipartFormEntity.java:52)
02-16 14:16:18.421: E/AndroidRuntime(20632): at org.apache.http.entity.mime.MultipartEntityBuilder.buildEntity(MultipartEntityBuilder.java:226)
02-16 14:16:18.421: E/AndroidRuntime(20632): at org.apache.http.entity.mime.MultipartEntity.getEntity(MultipartEntity.java:119)
02-16 14:16:18.421: E/AndroidRuntime(20632): at org.apache.http.entity.mime.MultipartEntity.getContentType(MultipartEntity.java:150)
02-16 14:16:18.421: E/AndroidRuntime(20632): at org.apache.http.impl.client.AbstractHttpClient.isMoMMS(AbstractHttpClient.java:757)
02-16 14:16:18.421: E/AndroidRuntime(20632): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:581)
02-16 14:16:18.421: E/AndroidRuntime(20632): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:511)
02-16 14:16:18.421: E/AndroidRuntime(20632): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:489)
02-16 14:16:18.421: E/AndroidRuntime(20632): at com.example.testingandroid.MainActivity.uploadVideo(MainActivity.java:162)
02-16 14:16:18.421: E/AndroidRuntime(20632): at com.example.testingandroid.MainActivity.onActivityResult(MainActivity.java:113)
02-16 14:16:18.421: E/AndroidRuntime(20632): at android.app.Activity.dispatchActivityResult(Activity.java:5456)
02-16 14:16:18.421: E/AndroidRuntime(20632): at android.app.ActivityThread.deliverResults(ActivityThread.java:3549)
02-16 14:16:18.421: E/AndroidRuntime(20632): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3596)
02-16 14:16:18.421: E/AndroidRuntime(20632): at android.app.ActivityThread.access$1300(ActivityThread.java:151)
02-16 14:16:18.421: E/AndroidRuntime(20632): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1369)
02-16 14:16:18.421: E/AndroidRuntime(20632): at android.os.Handler.dispatchMessage(Handler.java:110)
02-16 14:16:18.421: E/AndroidRuntime(20632): at android.os.Looper.loop(Looper.java:193)
02-16 14:16:18.421: E/AndroidRuntime(20632): at android.app.ActivityThread.main(ActivityThread.java:5292)
02-16 14:16:18.421: E/AndroidRuntime(20632): at java.lang.reflect.Method.invokeNative(Native Method)
02-16 14:16:18.421: E/AndroidRuntime(20632): at java.lang.reflect.Method.invoke(Method.java:515)
02-16 14:16:18.421: E/AndroidRuntime(20632): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828)
02-16 14:16:18.421: E/AndroidRuntime(20632): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644)
02-16 14:16:18.421: E/AndroidRuntime(20632): at dalvik.system.NativeStart.main(Native Method)
Tejas Sherdi..
8
您的代码可以摆脱已弃用的代码MultipartEntity
和使用MultipartEntityBuilder
.然而,这里涉及的具体问题是核心Android库与新添加的库冲突.现在还有maven存储库可用.您可以在以下文件中包含以下代码:
build.grade(模块:app)
compile('org.apache.httpcomponents:httpmime:4.3.6') {
exclude module: 'httpclient'
}
compile 'org.apache.httpcomponents:httpclient-android:4.3.5'
这种方式非常简单.由于奥列格的答案在这里
1> Tejas Sherdi..:
您的代码可以摆脱已弃用的代码MultipartEntity
和使用MultipartEntityBuilder
.然而,这里涉及的具体问题是核心Android库与新添加的库冲突.现在还有maven存储库可用.您可以在以下文件中包含以下代码:
build.grade(模块:app)
compile('org.apache.httpcomponents:httpmime:4.3.6') {
exclude module: 'httpclient'
}
compile 'org.apache.httpcomponents:httpclient-android:4.3.5'
这种方式非常简单.由于奥列格的答案在这里