简体   繁体   中英

How can I let people take a picture that they use in my app?

I have made an app that looks kinda like snake. There is one big red block and everytime you touch the little white blocks with the big red block somewhere in your screen another little white block pops up. That repeats for about 30 seconds. But now I want to know how I can make people take their own picture of their head for example and use it as the red block. So your face needs to eat al the white blocks. I've searched a little bit around and I saw that Smosh Super Head Esploder X has kind of got the same function I want. Please help me !

Use this, It will help you to take picture from camera and also from gallery..

/*captureImageInitialization Method
 * to select image from gallery or pick through camera
 */
 private void captureImageInitialization() {
    /**
     * a selector dialog to display two image source options, from camera
     * ‘Take from camera’ and from existing files ‘Select from gallery’
     */
    final String[] items = new String[] { "Take from camera","Select from gallery" };
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getBaseContext(),android.R.layout.select_dialog_item, items);
    AlertDialog.Builder builder = new AlertDialog.Builder(getBaseContext());

    builder.setTitle("Select Image");
    builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
        /*
         * (non-Javadoc)
         * @see android.content.DialogInterface.OnClickListener#onClick(android.content.DialogInterface, int)
         */
        public void onClick(DialogInterface dialog, int item) { // pick from
                                                                // camera
               if (item == 0){
                /**
                 * To take a photo from camera, pass intent action
                 * ‘MediaStore.ACTION_IMAGE_CAPTURE‘ to open the camera app.
                 */
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                /**
                 * Also specify the Uri to save the image on specified path
                 * and file name. Note that this Uri variable also used by
                 * gallery app to hold the selected image path.
                 */
                mImageCaptureUri = Uri.fromFile(new File(Environment
                        .getExternalStorageDirectory(), "tmp_avatar_"
                        + String.valueOf(System.currentTimeMillis())
                        + ".jpg"));
                intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
                        mImageCaptureUri);
                 try {
                    intent.putExtra("return-data", true);
                    startActivityForResult(intent, PICK_FROM_CAMERA);
                   }catch (ActivityNotFoundException e) {
                    e.printStackTrace();
                  }
                } else{
                // pick from file
                /**
                 * To select an image from existing files, use
                 * Intent.createChooser to open image chooser. Android will
                 * automatically display a list of supported applications,
                 * such as image gallery or file manager.
                 */
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,
                        "Complete action using"), PICK_FROM_FILE);
            }
         }
     });
     dialog = builder.create();
}
/*
* (non-Javadoc)
* @see android.app.Fragment#onActivityResult(int, int, android.content.Intent)
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != Activity.RESULT_OK)
        return;
    switch (requestCode) {

    case PICK_FROM_CAMERA:
        /**
         * After taking a picture, do the crop
         */
        doCrop();
        break;
    case PICK_FROM_FILE:
        /**
         * After selecting image from files, save the selected path
         */
         mImageCaptureUri = data.getData();
         doCrop();
         break;
    case CROP_FROM_CAMERA:
        Bundle extras = data.getExtras();
        /**
         * After cropping the image, get the bitmap of the cropped image and
         * display it on imageview.
         */
        if (extras != null) {
            Bitmap photo = extras.getParcelable("data");
            imageofuser.setImageBitmap(photo);
            }
        File f = new File(mImageCaptureUri.getPath());
        /**
         * Delete the temporary image
         */
        if (f.exists())
            f.delete();
           break;
        }
 }
 /*doCrop() method
  * this method crop the selected image and set to imageview
  */
    private void doCrop() {
        final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();
        /**
         * Open image crop app by starting an intent
         * ‘com.android.camera.action.CROP‘.
         */
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setType("image/*");

        /**
         * Check if there is image cropper app installed.
         */
        List<ResolveInfo> list = getBaseContext().getPackageManager().queryIntentActivities(intent, 0);
        int size = list.size();

        /**
         * If there is no image cropper app, display warning message
         */
        if (size == 0) {
            Toast.makeText(getBaseContext(), "Can not find image crop app",Toast.LENGTH_SHORT).show();
            return;
        } else {
        /**
         * Specify the image path, crop dimension and scale
         */
        intent.setData(mImageCaptureUri);
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 200);
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true);
        /**
         * There is posibility when more than one image cropper app exist,
         * so we have to check for it first. If there is only one app, open
         * then app.
         */
               if (size==1){
                Intent i = new Intent(intent);
                ResolveInfo res = list.get(0);
                i.setComponent(new ComponentName(res.activityInfo.packageName,
                    res.activityInfo.name));
                startActivityForResult(i, CROP_FROM_CAMERA);
            } else {
            /**
             * If there are several app exist, create a custom chooser to
             * let user selects the app.
             */
             for(ResolveInfo res : list) {
                final CropOption co = new CropOption();
                co.title = getBaseContext().getPackageManager().getApplicationLabel(
                        res.activityInfo.applicationInfo);
                co.icon =getBaseContext().getPackageManager().getApplicationIcon(
                        res.activityInfo.applicationInfo);
                co.appIntent = new Intent(intent);
                co.appIntent.setComponent(new ComponentName(
                                res.activityInfo.packageName,
                                res.activityInfo.name));
                cropOptions.add(co);
             }
            CropOptionAdapter adapter = new CropOptionAdapter(getBaseContext().getApplicationContext(), cropOptions);

            AlertDialog.Builder builder = new AlertDialog.Builder(getBaseContext());
            builder.setTitle("Choose Crop App");
            builder.setAdapter(adapter,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int item) {
                            startActivityForResult(
                                    cropOptions.get(item).appIntent,
                                    CROP_FROM_CAMERA);
                        }
                    });

            builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {

                    if (mImageCaptureUri != null) {getBaseContext().getContentResolver().delete(mImageCaptureUri, null,
                                null);
                        mImageCaptureUri = null;
                    }
                }
            });
            AlertDialog alert = builder.create();
            alert.show();
        }
    }
}

CropOptionAdapter:

    public class CropOptionAdapter extends ArrayAdapter<CropOption> {
    private ArrayList<CropOption> mOptions;
    private LayoutInflater mInflater;

    public CropOptionAdapter(Context context, ArrayList<CropOption> options){
        super(context, R.layout.crop_selector);
        mOptions = options;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup group) {
        if(convertView==null)
        convertView = mInflater.inflate(R.layout.crop_selector, null);
        CropOption item = mOptions.get(position);
        if(item != null){
        ((ImageView) convertView.findViewById(R.id.iv_icon))
                    .setImageDrawable(item.icon);
        ((TextView) convertView.findViewById(R.id.tv_name))
                    .setText(item.title);
         return convertView;
        }
         return null;
       }
     }

   class CropOption {
    public CharSequence title;
    public Drawable icon;
    public Intent appIntent;
 }

cropselector.xml:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="10dp">

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""/>
</LinearLayout>

And provide image crop option,,

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM