2012-03-17 14 views
15

Użyłem tego kodu, aby zrobić zdjęcie z aparatu.Zrób zdjęcie automatycznie bez interakcji użytkownika

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

}

Ale w tym kodzie otwiera aparat i użytkownik musi kliknąć przycisk, aby zrobić zdjęcie. Potrzebne jest automatyczne zrobienie zdjęcia (bez podglądu) i zapisanie go na karcie pamięci.

+2

Czy można uznać, że jest to rzeczywiście miarą bezpieczeństwa? Jak myślisz, dlaczego to w ogóle możliwe? Poza tym, dlaczego tego potrzebujesz? –

+2

Z pozytywnego punktu widzenia, jeśli znajdziesz jakiś sposób, muszę gdzieś wysłać raport o błędzie :-) –

+0

Buduję aplikację zabezpieczającą. Muszę więc zrobić zdjęcie, nie znając użytkownika. – MoraRockey

Odpowiedz

9

Android nie pozwala na robienie zdjęć bez wyświetlania okna podglądu. Musisz więc bardzo mały widok powierzchni. Podobnie jak 1 * 1 piksel i umieść go w rogu dowolnego elementu sterującego.

Aby to zrobić, należy wyświetlić atrapowy widok powierzchni.

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

Sprawdź (usunięte uszkodzony Link), this i this zewnątrz.

4

Ten kod jest przechwytywanie obrazu za pomocą przednią kamerę i zapisać go automatycznie

/** 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 
Powiązane problemy