2012-03-17 27 views
15

Tôi đã sử dụng mã này để chụp ảnh từ máy ảnh.Chụp ảnh tự động mà không có sự tương tác của người dùng

package android.takeowneship; 


import java.io.File; 

import android.app.Activity; 
import android.content.ContentValues; 
import android.content.Intent; 
import android.database.Cursor; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.widget.ImageView; 
import android.widget.Toast; 


public class camera extends Activity{ 


    private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100; 

    Uri imageUri; 
    private ImageView imageView; 

    @Override 
     public void onCreate(Bundle savedInstanceState){ 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

      //define the file-name to save photo taken by Camera activity 
      String fileName = "new-photo-name.jpg"; 
      //create parameters for Intent with filename 
      ContentValues values = new ContentValues(); 
      values.put(MediaStore.Images.Media.TITLE, fileName); 
      values.put(MediaStore.Images.Media.DESCRIPTION,"Image capture by camera"); 
      //imageUri is the current activity attribute, define and save it for later usage (also in onSaveInstanceState) 
      imageUri = getContentResolver().insert(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
      //create new Intent 
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
      intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); 
      startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 

     } 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

     if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 
      if (resultCode == RESULT_OK) { 
       //use imageUri here to access the image 
       Toast.makeText(this, "picture has been taken"+ imageUri, Toast.LENGTH_SHORT).show(); 


      } else if (resultCode == RESULT_CANCELED) { 
       Toast.makeText(this, "Picture was not taken", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(this, "Picture was not taken", Toast.LENGTH_SHORT).show(); 
      } 
     } 

     } 

    public static File convertImageUriToFile (Uri imageUri, Activity activity) { 

     Cursor cursor = null; 
     try { 
      String [] proj={MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID, MediaStore.Images.ImageColumns.ORIENTATION}; 
      cursor = activity.managedQuery(imageUri, 
        proj, // Which columns to return 
        null,  // WHERE clause; which rows to return (all rows) 
        null,  // WHERE clause selection arguments (none) 
        null); // Order-by clause (ascending by name) 
      int file_ColumnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
//   int orientation_ColumnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.ORIENTATION); 
      if (cursor.moveToFirst()) { 
//    String orientation = cursor.getString(orientation_ColumnIndex); 
       return new File(cursor.getString(file_ColumnIndex)); 
      } 
      return null; 
     } finally { 
      if (cursor != null) { 
       cursor.close(); 
      } 
     } 
     } 

}

Nhưng trong mã này nó sẽ mở ra camera và người dùng phải bấm vào nút để chụp ảnh. Điều tôi muốn là tự động chụp ảnh (không có bản xem trước) và lưu nó vào thẻ nhớ.

+2

Bạn đã coi đây thực sự là một phép đo an ninh? Tại sao bạn nghĩ rằng điều này là có thể ở tất cả? Ngoài ra, tại sao bạn cần điều đó? –

+2

Trên một lưu ý tích cực, nếu bạn tìm thấy một cách, tôi sẽ phải nộp báo cáo lỗi ở đâu đó :-) –

+0

Tôi đang xây dựng một ứng dụng bảo mật. Vì vậy, tôi cần chụp ảnh mà không cần biết người dùng. – MoraRockey

Trả lời

9

Android không cho phép bạn chụp ảnh mà không hiển thị cửa sổ xem trước. Vì vậy, bạn phải làm cho bề mặt xem rất nhỏ. Giống như 1 * 1 pixel và đặt nó ở góc của bất kỳ kiểm soát nào.

Hoặc hiển thị chế độ xem bề mặt giả để thực hiện việc này.

SurfaceView view = new SurfaceView(this); 
c.setPreviewDisplay(view.getHolder()); 
c.startPreview(); 
c.takePicture(shutterCallback, rawPictureCallback, jpegPictureCallback); 

Kiểm tra (liên kết bị phá vỡ loại bỏ), thisthis ra.

4

Mã này được chụp ảnh bằng cách sử dụng camera phía trước và lưu nó tự động

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 

    int index = getFrontCameraId(); 
    if (index == -1){ 
     Toast.makeText(getApplicationContext(), "No front camera", Toast.LENGTH_LONG).show(); 
    } 
    else 
    { 
     iv_image = (ImageView) findViewById(R.id.imageView); 
     sv = (SurfaceView) findViewById(R.id.surfaceView); 
     sHolder = sv.getHolder(); 
     sHolder.addCallback(this); 
     sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) 
{ 
    parameters = mCamera.getParameters(); 
    mCamera.setParameters(parameters); 
    mCamera.startPreview(); 

    Camera.PictureCallback mCall = new Camera.PictureCallback() 
    { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) 
     {   
      Uri uriTarget = getContentResolver().insert//(Media.EXTERNAL_CONTENT_URI, image); 
      (Media.EXTERNAL_CONTENT_URI, new ContentValues()); 

      OutputStream imageFileOS; 
      try { 
       imageFileOS = getContentResolver().openOutputStream(uriTarget); 
       imageFileOS.write(data); 
       imageFileOS.flush(); 
       imageFileOS.close(); 

       Toast.makeText(TakePictureActivity.this, 
         "Image saved: " + uriTarget.toString(), Toast.LENGTH_LONG).show(); 
      } 
      catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      }catch (IOException e) { 
       e.printStackTrace(); 
      } 
      //mCamera.startPreview(); 

      bmp = BitmapFactory.decodeByteArray(data, 0, data.length); 
      iv_image.setImageBitmap(bmp); 
     } 
    }; 

    mCamera.takePicture(null, null, mCall); 
} 

int getFrontCameraId() { 
    CameraInfo ci = new CameraInfo(); 
    for (int i = 0 ; i < Camera.getNumberOfCameras(); i++) { 
     Camera.getCameraInfo(i, ci); 
     if (ci.facing == CameraInfo.CAMERA_FACING_FRONT) return i; 
     } 
return -1; // No front-facing camera found 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) 
{ 
    int index = getFrontCameraId(); 
    if (index == -1){ 
     Toast.makeText(getApplicationContext(), "No front camera", Toast.LENGTH_LONG).show(); 
    } 
    else 
    { 
     mCamera = Camera.open(index); 
     Toast.makeText(getApplicationContext(), "With front camera", Toast.LENGTH_LONG).show(); 
    } 
     mCamera = Camera.open(index); 
     try { 
     mCamera.setPreviewDisplay(holder); 

     } catch (IOException exception) { 
      mCamera.release(); 
      mCamera = null; 
     } 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) 
{ 
    mCamera.stopPreview(); 
    mCamera.release(); 
    mCamera = null; 
} 

}

0
Capturing Image without user interaction(without user action) and capture an image in background using android service 


import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 

import android.app.Service; 
import android.content.Intent; 
import android.hardware.Camera; 
import android.hardware.Camera.CameraInfo; 
import android.hardware.Camera.Parameters; 
import android.os.Environment; 
import android.os.IBinder; 
import android.os.StrictMode; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class CapPhoto extends Service 
{ 
    private SurfaceHolder sHolder; 
    private Camera mCamera; 
    private Parameters parameters; 


    @Override 
    public void onCreate() 
    { 
     super.onCreate(); 
     Log.d("CAM", "start"); 

     if (android.os.Build.VERSION.SDK_INT > 9) { 
      StrictMode.ThreadPolicy policy = 
       new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
      StrictMode.setThreadPolicy(policy);}; 
      Thread myThread = null; 


    } 
    @Override 
    public void onStart(Intent intent, int startId) { 

    super.onStart(intent, startId); 

if (Camera.getNumberOfCameras() >= 2) { 

    mCamera = Camera.open(CameraInfo.CAMERA_FACING_FRONT); } 

if (Camera.getNumberOfCameras() < 2) { 

    mCamera = Camera.open(); } 
    SurfaceView sv = new SurfaceView(getApplicationContext()); 


    try { 
       mCamera.setPreviewDisplay(sv.getHolder()); 
       parameters = mCamera.getParameters(); 
       mCamera.setParameters(parameters); 
       mCamera.startPreview(); 

       mCamera.takePicture(null, null, mCall); 
     } catch (IOException e) { e.printStackTrace(); } 

     sHolder = sv.getHolder(); 
     sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    Camera.PictureCallback mCall = new Camera.PictureCallback() 
    { 

    public void onPictureTaken(final byte[] data, Camera camera) 
    { 

     FileOutputStream outStream = null; 
       try{ 

        File sd = new File(Environment.getExternalStorageDirectory(), "A"); 
        if(!sd.exists()) {        
         sd.mkdirs(); 
         Log.i("FO", "folder" + Environment.getExternalStorageDirectory()); 
        } 

         Calendar cal = Calendar.getInstance(); 
         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); 
         String tar = (sdf.format(cal.getTime())); 

         outStream = new FileOutputStream(sd+tar+".jpg"); 
         outStream.write(data); outStream.close(); 

         Log.i("CAM", data.length + " byte written to:"+sd+tar+".jpg"); 
         camkapa(sHolder);    


       } catch (FileNotFoundException e){ 
        Log.d("CAM", e.getMessage()); 
       } catch (IOException e){ 
        Log.d("CAM", e.getMessage()); 
       }} 
    }; 


    @Override 
    public IBinder onBind(Intent intent) { 
      return null; 
    } 

    public void camkapa(SurfaceHolder sHolder) { 

     if (null == mCamera) 
      return; 
     mCamera.stopPreview(); 
     mCamera.release(); 
     mCamera = null; 
     Log.i("CAM", " closed"); 
     } 

    } 



Step:2 Activity File - name is :Second.java 





import java.util.Calendar; 

import android.app.Activity; 
import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.Menu; 

public class Second extends Activity { 


    Intent service; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_second); 

     Calendar cal = Calendar.getInstance(); 

     service = new Intent(getBaseContext(), CapPhoto.class); 
     cal.add(Calendar.SECOND, 15); 
     //TAKE PHOTO EVERY 15 SECONDS 
     PendingIntent pintent = PendingIntent.getService(this, 0, service, 0); 
     AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

     alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 
        60*60*1000, pintent); 
     startService(service); 


    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.second, menu); 
     return true; 
    } 


} 


step 3: Android manife 

st file 

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.dbsource.dbinsert" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 


    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-permission android:name="android.permission.VIBRATE" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.RECEIVE_SMS" /> 
    <uses-permission android:name="android.permission.RECORD_AUDIO" /> 
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 
    <uses-permission android:name="android.permission.READ_CONTACTS" /> 
    <uses-permission android:name="android.permission.WRITE_CONTACTS" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.BROADCAST_STICKY" /> 
    <uses-permission android:name="android.permission.SEND_SMS" /> 
    <uses-permission android:name="android.permission.READ_SMS" /> 
    <uses-permission android:name="android.permission.READ_CONTACTS" /> 
    <uses-permission android:name="android.permission.BROADCAST_STICKY" /> 
    <uses-permission android:name="android.permission.WRITE_SETTINGS" /> 

    <uses-feature android:name="android.hardware.camera" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".Second" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 



     <service android:name=".CapPhoto" android:enabled="true"> 

        <intent-filter> 

        </intent-filter> 
       </service> 

     </application> 



</manifest> 


refer this link [enter link description here][1] 


    [1]: http://chandandroid.blogspot.in/2014/04/capturing-image-without-user-action.html 
Các vấn đề liên quan