如何在另一个活动中将图像文件传递给MediaStore?

时间:2016-03-10 13:07:14

标签: android android-camera

我正在使用自定义的相机活动,并在列表视图活动中加载捕获的图像。加载功能仅在我切换到自定义相机之前才可用,它可以与现有的相机应用程序一起正常工作。

cameraActivity.java

public class custom_camera extends Activity {

private Camera mCamera;
private custom_camera_preview mPreview;
private PictureCallback mPicture;
private ImageButton capture;
private ImageButton switchCamera;
private Context myContext;
private LinearLayout cameraPreview;
private boolean cameraFront = false;
private Uri mCapturedImageURI;

LayoutInflater controlInflater = null;

public void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera_main);
    controlInflater = LayoutInflater.from(getBaseContext());
    View viewControl = controlInflater.inflate(R.layout.control, null);
    LinearLayout.LayoutParams layoutParamsControl = new      LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);
    this.addContentView(viewControl, layoutParamsControl);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    myContext = this;
    initialize();
}

private int findFrontFacingCamera() {
    int cameraId = -1;
    // Search for the front facing camera
    int numberOfCameras = Camera.getNumberOfCameras();
    for (int i = 0; i < numberOfCameras; i++) {
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(i, info);
        if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
            cameraId = i;
            cameraFront = true;
            break;
        }
    }
    return cameraId;
}

private int findBackFacingCamera() {
    int cameraId = -1;
    //Search for the back facing camera
    //get the number of cameras
    int numberOfCameras = Camera.getNumberOfCameras();
    //for every camera check
    for (int i = 0; i < numberOfCameras; i++) {
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(i, info);
        if (info.facing == CameraInfo.CAMERA_FACING_BACK) {
            cameraId = i;
            cameraFront = false;
            break;
        }
    }
    return cameraId;
}

public void onResume() {
    super.onResume();
    if (!hasCamera(myContext)) {
        Toast toast = Toast.makeText(myContext, "Sorry, your phone does not have a camera!", Toast.LENGTH_LONG);
        toast.show();
        finish();
    }
    if (mCamera == null) {
        //if the front facing camera does not exist
        if (findFrontFacingCamera() < 0) {
            Toast.makeText(this, "No front facing camera found.", Toast.LENGTH_LONG).show();
            switchCamera.setVisibility(View.GONE);
        }
        mCamera = Camera.open(findBackFacingCamera());
        mCamera.setDisplayOrientation(90);
        mPicture = getPictureCallback();
        mPreview.refreshCamera(mCamera);
    }
}

public void initialize() {
    cameraPreview = (LinearLayout) findViewById(R.id.camera_preview);
    mPreview = new custom_camera_preview(myContext, mCamera);
    cameraPreview.addView(mPreview);

    capture = (ImageButton) findViewById(R.id.takepicture);
    capture.setOnClickListener(captrureListener);

    switchCamera = (ImageButton) findViewById(R.id.button_ChangeCamera);
    switchCamera.setOnClickListener(switchCameraListener);


}

View.OnClickListener switchCameraListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //get the number of cameras
        int camerasNumber = Camera.getNumberOfCameras();
        if (camerasNumber > 1) {
            //release the old camera instance
            //switch camera, from the front and the back and vice versa

            releaseCamera();
            chooseCamera();
        } else {
            Toast toast = Toast.makeText(myContext, "Sorry, your phone has only one camera!", Toast.LENGTH_LONG);
            toast.show();
        }
    }
};

public void chooseCamera() {
    //if the camera preview is the front
    if (cameraFront) {
        int cameraId = findBackFacingCamera();
        if (cameraId >= 0) {
            //open the backFacingCamera
            //set a picture callback
            //refresh the preview
            mCamera = Camera.open(cameraId);
            mCamera.setDisplayOrientation(90);
            mPicture = getPictureCallback();
            mPreview.refreshCamera(mCamera);
        }
    } else {
        int cameraId = findFrontFacingCamera();
        if (cameraId >= 0) {
            //open the frontFacingCamera
            //set a picture callback
            //refresh the preview
            mCamera = Camera.open(cameraId);
            mCamera.setDisplayOrientation(90);
            mPicture = getPictureCallback();
            mPreview.refreshCamera(mCamera);
        }
    }
}

@Override
protected void onPause() {
    super.onPause();
    //when on Pause, release camera in order to be used from other applications
    releaseCamera();
}

private boolean hasCamera(Context context) {
    //check if the device has camera
    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
        return true;
    } else {
        return false;
    }
}

private PictureCallback getPictureCallback() {
    PictureCallback picture = new PictureCallback() {

        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            //make a new picture file
            File pictureFile = getOutputMediaFile();

            if (pictureFile == null) {
                return;
            }
            try {
                //write the file
                FileOutputStream fos = new FileOutputStream(pictureFile);
                fos.write(data);
                fos.close();
                Toast toast = Toast.makeText(myContext, "Picture saved: " + pictureFile.getName(), Toast.LENGTH_LONG);
                toast.show();


            } catch (FileNotFoundException e) {

            } catch (IOException e) {

            }

            //refresh camera to continue preview
            mPreview.refreshCamera(mCamera);
            Intent i = new Intent(getApplicationContext(),listview_page.class);
            startActivity(i);
        }
    };
    return picture;
}

View.OnClickListener captrureListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mCamera.takePicture(null, null, mPicture);
    }
};

//make picture and save to a folder
private static File getOutputMediaFile() {
    //make a new file directory inside the "sdcard" folder
    File mediaStorageDir = new File("/sdcard/", "JCG Camera");

    //if this "JCGCamera folder does not exist
    if (!mediaStorageDir.exists()) {
        //if you cannot make this folder return
        if (!mediaStorageDir.mkdirs()) {
            return null;
        }
    }

    //take the current timeStamp
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    //and make a media file:
    mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");

    return mediaFile;
}

private void releaseCamera() {
    // stop and release camera
    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
    }
}
}

listview.java

public class listview_page extends Activity{
private ArrayList<MyImage> images;
private ImageAdapter imageAdapter;
private ListView listView;
private Uri mCapturedImageURI;
private static final int RESULT_LOAD_IMAGE = 1;
private static final int REQUEST_IMAGE_CAPTURE = 2;
private DAOdb daOdb;

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

    // Construct the data source
    images = new ArrayList();
    // Create the adapter to convert the array to views
    imageAdapter = new ImageAdapter(this, images);
    // Attach the adapter to a ListView
    listView = (ListView) findViewById(R.id.main_list_view);
    listView.setAdapter(imageAdapter);
    addItemClickListener(listView);
    initDB();
}

/**
 * initialize database
 */
private void initDB() {
    daOdb = new DAOdb(this);
    //        add images from database to images ArrayList
    for (MyImage mi : daOdb.getImages()) {
        images.add(mi);
    }
}

public void btnAddOnClick(View view) {
    final Dialog dialog = new Dialog(this);
    dialog.setContentView(R.layout.custom_dialog_box);
    dialog.setTitle("iTongue");
    dialog.findViewById(R.id.btnChoosePath).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            activeGallery();
        }
    });
    dialog.findViewById(R.id.btnTakePhoto).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            activeTakePhoto();
            Intent i = new Intent(getApplicationContext(),custom_camera.class);
            startActivity(i);
        }
    });

    // show dialog on screen
    dialog.show();
}

/**
 * take a photo
 */
private void activeTakePhoto() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        String fileName = "temp.jpg";
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.TITLE, fileName);
        mCapturedImageURI = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}

/**
 * to gallery
 */
private void activeGallery() {
    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(intent, RESULT_LOAD_IMAGE);
}

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case RESULT_LOAD_IMAGE:
            if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
                Uri selectedImage = data.getData();
                String[] filePathColumn = {MediaStore.Images.Media.DATA};
                Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
                cursor.moveToFirst();
                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                String picturePath = cursor.getString(columnIndex);
                cursor.close();
                MyImage image = new MyImage();
                image.setTitle("Tongue Image");
                image.setDescription("test choose a photo from gallery and add it to " + "list view");
                image.setDatetime(System.currentTimeMillis());
                image.setPath(picturePath);
                images.add(image);
                daOdb.addImage(image);
            }
        case REQUEST_IMAGE_CAPTURE:
            if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
                String[] projection = {MediaStore.Images.Media.DATA};
                Cursor cursor = managedQuery(mCapturedImageURI, projection, null, null, null);
                int column_index_data = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                String picturePath = cursor.getString(column_index_data);
                MyImage image = new MyImage();
                image.setTitle("Tongue Image");
                image.setDescription("test take a photo and add it to list view");
                image.setDatetime(System.currentTimeMillis());
                image.setPath(picturePath);
                images.add(image);
                daOdb.addImage(image);
            }
    }
}

/**
 * item clicked listener used to implement the react action when an item is
 * clicked.
 *
 * @param listView
 */
private void addItemClickListener(final ListView listView) {
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            MyImage image = (MyImage) listView.getItemAtPosition(position);
            Intent intent = new Intent(getBaseContext(), DisplayImage.class);
            intent.putExtra("IMAGE", (new Gson()).toJson(image));
            startActivity(intent);
        }
    });
}

@Override protected void onSaveInstanceState(Bundle outState) {
    // Save the user's current game state
    if (mCapturedImageURI != null) {
        outState.putString("mCapturedImageURI", mCapturedImageURI.toString());
    }
    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(outState);
}

@Override protected void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    if (savedInstanceState.containsKey("mCapturedImageURI")) {
        mCapturedImageURI = Uri.parse(savedInstanceState.getString("mCapturedImageURI"));
    }
}
}

我第一次发帖提问,对于大量的代码感到抱歉。

1 个答案:

答案 0 :(得分:0)

您可以按照以下方式执行此操作

第一种方式:根据请求创建Application类并保存set和get 你记得你必须在menifest文件中定义它,如

第二种方式:制作界面类

第三种方式:制作静态物体