0

我在我的应用程序中有一个非常简单的任务要做。我试图在我的应用程序中实现以下目标。

1.按下按钮时使用自定义Camerahardware volume捕获图像。一旦开始捕获,它应该定期自动捕获图像(比如说2秒)。

2.每张图片都必须保存在SD卡中,并在后台发送到对应的Mail Id。

为了实现上述目的,我创建了一个自定义Camera Classoverride硬件volume按钮来捕获图片。为了在后台发送邮件,我使用了 Java Mail API。

由于我必须每隔 2 秒发送一次邮件,所以我使用AsyncTask. 我从这里和其他一些帖子中发现,池大小AsyncTask总计为 Max 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 mPicture = new PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            new SavePhotoTask().execute(data);
             if (mCamera!= null)
            camera.startPreview();
        }

    };

保存照片任务()

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);


        }


    }

发邮件()

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

创建自己的请求队列,将每个“发送图片”请求放入队列,并使用一个邮件任务处理来自队列的请求。使用单个连接发送队列中的所有请求,直到队列为空,然后关闭连接并等待下一个请求。

于 2013-08-26T18:21:08.517 回答