私のアプリは Sony Experia (2.3) では正常に実行されますが、Samsung Galaxy Tab (4.1) で実行すると例外が発生します。私の問題は、ビデオを録画してbase64文字列に変換した後、それをsoapに解析しているときにエラーが発生することです。
これは、ビデオをキャプチャするための私のコードです(インテントを渡します):
Intent videoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
videoIntent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10);
videoIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
startActivityForResult(videoIntent, ACTION_TAKE_VIDEO);
On Activity 結果メソッド:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if ((requestCode == ACTION_TAKE_VIDEO && resultCode == RESULT_OK)) {
System.out.println("capturing video");
Uri selectedImage = data.getData();
String videoPath = getRealPathFromURI(selectedImage);
Bitmap bm = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Images.Thumbnails.MINI_KIND);
videoview.setImageBitmap(bm);
System.out.println("videobitmap=="+bm);
bytes[]datas = null;
String dataPath = videoPath;
InputStream is = null;
try {
is = new FileInputStream(dataPath);
datas = readBytes(is);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
String encodedImage = Base64.encodeToString(datas, Base64.DEFAULT);
isInternetPresent = cd.isConnectingToInternet();
if (isInternetPresent) {
new BufferingVideo().execute(encodedImage);
} else {
Toast.makeText(getApplicationContext(), "Sorry, we couldn't connect to server, please check your
internet connection", Toast.LENGTH_LONG).show();
}
}
}
public byte[] readBytes(InputStream inputStream) throws IOException {
ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
byteBuffer.write(buffer, 0, len);
}
return byteBuffer.toByteArray();
}
public String getRealPathFromURI(Uri contentUri) {
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
base64 文字列を Webservice に渡します。
protected String doInBackground(String... params) {
String st = params[0];
System.out.println("st==== " + st);
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME4);
System.err.println("Request = " + request);
request.addProperty("VideoBuffer", st);
request.addProperty("VideoName", "VideoCar");
request.addProperty("ModuleName", modulename);
}
私のLogcatエラーは次のとおりです。
致命的な例外: AsyncTask #5 java.lang.RuntimeException: doInBackground() の実行中にエラーが発生しました android.os.AsyncTask$3.done(AsyncTask.java:299) で java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) で java.util.concurrent.FutureTask.setException (FutureTask.java:124) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) で java.util.concurrent.FutureTask.run (FutureTask.java:137) で java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1076) で java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) で java.lang.Thread.run(Thread.java:856) で 原因: java.lang.OutOfMemoryError java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94) で java.lang.AbstractStringBuilder.append0 (AbstractStringBuilder.java:145) で java.lang.StringBuffer.append(StringBuffer.java:219) で org.ksoap2.serialization.SoapObject.toString (SoapObject.java:456) で java.lang.StringBuilder.append(StringBuilder.java:202) で web.org.HouseRentInsertAds$BufferingVideo.doInBackground(HouseRentInsertAds.java:897) で web.org.HouseRentInsertAds$BufferingVideo.doInBackground(HouseRentInsertAds.java:1) で android.os.AsyncTask$2.call(AsyncTask.java:287) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) で
よろしければ解決策をお願いします。