0

アプリケーションで行うべき非常に単純なタスクがあります。アプリケーションで次のことを達成しようとしています。

1.ボタンが押されたときにカスタムCameraクラスを使用して画像をhardware volumeキャプチャします。キャプチャが開始されると、定期的な間隔(2秒としましょう)で自動的に画像をキャプチャする必要があります。

2.各画像をSDカードに保存し、バックグラウンドで対応するメールIDにメールする必要がありました。

上記を実現するために、カスタムCamera Classoverrideハードウェア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

このような長い説明で申し訳ありません。私の問題を説明するためのより短い方法を見つけることができませんでした。任意の提案をいただければ幸いです。どうもありがとう。

4

1 に答える 1

0

独自のリクエスト キューを作成し、各「画像送信」リクエストをキューに入れ、1 つのメール タスクを使用してキューからのリクエストを処理します。単一の接続を使用して、キューが空になるまでキューからすべてのリクエストを送信し、その後接続を閉じて次のリクエストを待ちます。

于 2013-08-26T18:21:08.517 に答える