如何使用Anywall在Parse上拍摄和保存图片?

时间:2015-05-25 21:53:52

标签: android android-fragments android-studio parse-platform android-camera

我正在阅读Parse.com的Anywall和MealSpotter示例,并想知道我将如何组合他们的一些功能。例如,我如何拍摄和保存图片而不是简单地在Anywall示例的帖子中写文字?我会创建一个新的CameraFragment类,还是需要创建其他类?

1 个答案:

答案 0 :(得分:2)

我在MealSpotter应用程序之后为我的大学创建了一个应用程序。

  

创建一个使用getter和setter扩展ParseObject的类

public ParseFile getPhotoFile() {
    return getParseFile("photo");
}

public void setPhotoFile(ParseFile file) {
    put("photo", file);
}
  

然后,创建CamaraFragment类

public class CameraFragment extends Fragment {

public static final String TAG = "CameraFragment";

private Camera camera;
private SurfaceView surfaceView;
private ParseFile photoFile;
private ActionButton photoButton;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_camera, parent, false);

    photoButton = (ActionButton) v.findViewById(R.id.camera_photo_button);

    if (camera == null) {
        try {
            camera = Camera.open();
            photoButton.setEnabled(true);
        } catch (Exception e) {
            Log.e(TAG, "No camera with exception: " + e.getMessage());
            photoButton.setEnabled(false);
            Toast.makeText(getActivity(), "No camera detected",
                    Toast.LENGTH_LONG).show();
        }
    }

    photoButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (camera == null)
                return;
            camera.takePicture(new Camera.ShutterCallback() {

                @Override
                public void onShutter() {
                    // nothing to do
                }

            }, null, new Camera.PictureCallback() {

                @Override
                public void onPictureTaken(byte[] data, Camera camera) {
                    saveScaledPhoto(data);
                }

            });

        }
    });

    surfaceView = (SurfaceView) v.findViewById(R.id.camera_surface_view);
    SurfaceHolder holder = surfaceView.getHolder();
    holder.addCallback(new Callback() {

        public void surfaceCreated(SurfaceHolder holder) {
            try {
                if (camera != null) {
                    camera.setDisplayOrientation(90);
                    camera.setPreviewDisplay(holder);
                    camera.startPreview();
                }
            } catch (IOException e) {
                Log.e(TAG, "Error setting up preview", e);
            }
        }

        public void surfaceChanged(SurfaceHolder holder, int format,
                int width, int height) {
            // nothing to do here
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
            // nothing here
        }

    });

    return v;
}

/*
 * ParseQueryAdapter loads ParseFiles into a ParseImageView at whatever size
 * they are saved. Since we never need a full-size image in our app, we'll
 * save a scaled one right away.
 */
private void saveScaledPhoto(byte[] data) {

    // Resize photo from camera byte array
    Bitmap bookImage = BitmapFactory.decodeByteArray(data, 0, data.length);
    // Trabajar con la foto aqui
    int h = bookImage.getHeight();
    int w = bookImage.getWidth();
    Bitmap bookImageScaled = Bitmap.createScaledBitmap(bookImage, 200, 200//800, 800
            * bookImage.getHeight() / bookImage.getWidth(), false);

    // Override Android default landscape orientation and save portrait
    Matrix matrix = new Matrix();
    matrix.postRotate(90);

    Bitmap rotatedScaledBookImage = Bitmap.createBitmap(bookImageScaled, 0,
            0, bookImageScaled.getWidth(), bookImageScaled.getHeight(),
            matrix, true);
    /*Bitmap rotatedScaledBookImage = Bitmap.createBitmap(bookImage,0,0,bookImage.getWidth(),bookImage.getHeight(),matrix,true);*/

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    rotatedScaledBookImage.compress(Bitmap.CompressFormat.JPEG, 100, bos);

    byte[] scaledData = bos.toByteArray();

    // TEST SCALED DATA -> DATA

    // Save the scaled image to Parse
    photoFile = new ParseFile("book_photo.jpg", scaledData);
    photoFile.saveInBackground(new SaveCallback() {

        public void done(ParseException e) {
            if (e != null) {
                Toast.makeText(getActivity(),
                        "Error saving: " + e.getMessage(),
                        Toast.LENGTH_LONG).show();
            } else {
                addPhotoToSaleAndReturn(photoFile);
            }
        }
    });
}

/*
 * Once the photo has saved successfully, we're ready to return to the
 * NewbookFragment. When we added the CameraFragment to the back stack, we
 * named it "NewMealFragment". Now we'll pop fragments off the back stack
 * until we reach that Fragment.
 */
private void addPhotoToSaleAndReturn(ParseFile photoFile) {
    //((SaleFragment) getActivity()).getCurrentSale().setPhotoFile(photoFile);
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Testttttttttttttt
    SaleFragment.getCurrentSale().setPhotoFile(photoFile);
    FragmentManager fm = getActivity().getSupportFragmentManager();
    fm.popBackStack("NewSaleFragment",
            FragmentManager.POP_BACK_STACK_INCLUSIVE);
}

@Override
public void onResume() {
    super.onResume();
    if (camera == null) {
        try {
            camera = Camera.open();
            photoButton.setEnabled(true);
        } catch (Exception e) {
            Log.i(TAG, "No camera: " + e.getMessage());
            photoButton.setEnabled(false);
            Toast.makeText(getActivity(), "No camera detected",
                    Toast.LENGTH_LONG).show();
        }
    }
}

@Override
public void onPause() {
    if (camera != null) {
        camera.stopPreview();
        camera.release();
    }
    super.onPause();
}
  

最后,将对象保存在您喜欢的活动中

// Save the sale and return
                      sale.saveInBackground(new SaveCallback() {

                           @Override
                           public void done(ParseException e) {
                               if (e == null) {
                                        getActivity().setResult(Activity.RESULT_OK);                                           

                               }
                               else {
                                        Toast.makeText(
                                                getActivity().getApplicationContext(),
                                                "Error saving: " + e.getMessage(),
                                                Toast.LENGTH_SHORT).show();
                               }
                           }

                      });