アプリケーションで行うべき非常に単純なタスクがあります。アプリケーションで次のことを達成しようとしています。
1.ボタンが押されたときにカスタムCamera
クラスを使用して画像をhardware
volume
キャプチャします。キャプチャが開始されると、定期的な間隔(2秒としましょう)で自動的に画像をキャプチャする必要があります。
2.各画像をSDカードに保存し、バックグラウンドで対応するメールIDにメールする必要がありました。
上記を実現するために、カスタムCamera Class
とoverride
ハードウェアvolume
ボタンを作成して写真をキャプチャし、バックグラウンドでメールを送信するために Java Mail API を使用しました。
2 秒ごとにメールを送信する必要があるため、メール送信と SD カードへの保存のコードを を使用して記述しAsyncTask
ました。hereおよび他のいくつかの投稿から、プールサイズが合計AsyncTask
で最大128 + 10 = 138であることがわかりました.2秒間隔でメールを送信しているため、最大プールサイズを超えてエラーが発生します.
しかし、私の要件は、高解像度の画像を 2 秒間隔でキャプチャし、対応するメール ID にメールで送信することです。
を使用することは可能AsyncTask
ですか? または、長時間実行されるタスクを実行するために Android が提供する他のフレームワークはありますか?
以下は、私がこれまでに試したことです。
ハードウェア ボリューム キーのオーバーライド
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
timer = new Timer();
TimerTask updateProfile = new CustomTimerTask(DVCameraActivity.this);
timer.scheduleAtFixedRate(updateProfile, 0, 2000);
Toast toast= Toast.makeText(getApplicationContext(), "Picture Capturing Started..", Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.show();
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}
カスタムタイマータスク
public class CustomTimerTask extends TimerTask {
public CustomTimerTask(Context con) {
}
@Override
public void run() {
if (isCamera == true)
mCamera.takePicture(null, null, mPicture);
}
}
PictureCallback
PictureCallback mPicture = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
new SavePhotoTask().execute(data);
if (mCamera!= null)
camera.startPreview();
}
};
SavePhotoTask()
class SavePhotoTask extends AsyncTask<byte[], String, String> {
@SuppressLint("SimpleDateFormat")
@Override
protected String doInBackground(byte[]... jpeg) {
File mediaStorageDir = new File(
Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
"Secret Camera");
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
Log.d("MyCameraApp", "failed to create directory");
return null;
}
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
.format(new Date());
File mediaFile;
mediaFile = new File(mediaStorageDir.getPath() + File.separator
+ "IMG_" + timeStamp + "." + mSuffix);
try {
FileOutputStream fos = new FileOutputStream(mediaFile);
fos.write(jpeg[0]);
fos.close();
path=mediaFile.getAbsolutePath();
SendMail(path);
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
return mediaFile.toString();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}
SendMail()
private void SendMail(String Imagepath) {
Mail m = new Mail(Constants.email, Constants.psw);
String[] toArr = { Constants.email };
m.setTo(toArr);
m.setFrom("<EMAIL>");
m.setSubject("Spy Camera Images");
m.setBody("If you are watching the image, then my Spy Camera App is working..Voila!!");
try {
m.addAttachment(Imagepath);
if (m.send()) {
Log.i("MAIL SEND", "SUCCESSS");
Send=true;
} else {
Send=false;
Log.i("MAIL SEND", "FAILED");
}
} catch (Exception e) {
Log.e("MailApp", "Could not send email", e);
}
}
Logcat エラー
08-23 18:37:55.609: I/dalvikvm(12540): DALVIK THREADS:
08-23 18:37:55.609: I/dalvikvm(12540): "main" prio=5 tid=1 WAIT
08-23 18:37:55.609: I/dalvikvm(12540): | group="main" sCount=1 dsCount=0 s=N obj=0x401b8968 self=0xcd38
08-23 18:37:55.609: I/dalvikvm(12540): | sysTid=12540 nice=0 sched=0/0 cgrp=default handle=-1345017816
08-23 18:37:55.609: I/dalvikvm(12540): at java.lang.Object.wait(Native Method)
08-23 18:37:55.609: I/dalvikvm(12540): - waiting on <0x48718010> (a android.os.MessageQueue)
08-23 18:37:55.609: I/dalvikvm(12540): at java.lang.Object.wait(Object.java:288)
08-23 18:37:55.617: I/dalvikvm(12540): at android.os.MessageQueue.next(MessageQueue.java:146)
08-23 18:37:55.617: I/dalvikvm(12540): at android.os.Looper.loop(Looper.java:110)
08-23 18:37:55.624: I/dalvikvm(12540): at android.app.ActivityThread.main(ActivityThread.java:4632)
08-23 18:37:55.624: I/dalvikvm(12540): at java.lang.reflect.Method.invokeNative(Native Method)
08-23 18:37:55.624: I/dalvikvm(12540): at java.lang.reflect.Method.invoke(Method.java:521)
08-23 18:37:55.624: I/dalvikvm(12540): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
08-23 18:37:55.624: I/dalvikvm(12540): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
08-23 18:37:55.624: I/dalvikvm(12540): at dalvik.system.NativeStart.main(Native Method)
08-23 18:37:55.624: I/dalvikvm(12540): "AsyncTask #34" prio=5 tid=42 MONITOR
このような長い説明で申し訳ありません。私の問題を説明するためのより短い方法を見つけることができませんでした。任意の提案をいただければ幸いです。どうもありがとう。