অ্যান্ড্রয়েড ক্যামেরা অভিপ্রায়


92

এটিকে ফটো তোলা, এটি সংরক্ষণ এবং একটি ইউআরআই ফিরিয়ে দেওয়ার জন্য আমার ডিফল্ট ক্যামেরা অ্যাপ্লিকেশনটির অভিপ্রায় চাপতে হবে। এই কাজ করতে কোন উপায় আছে কি?


উত্তর:


178
private static final int TAKE_PICTURE = 1;    
private Uri imageUri;

public void takePhoto(View view) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File photo = new File(Environment.getExternalStorageDirectory(),  "Pic.jpg");
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
            Uri.fromFile(photo));
    imageUri = Uri.fromFile(photo);
    startActivityForResult(intent, TAKE_PICTURE);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
    case TAKE_PICTURE:
        if (resultCode == Activity.RESULT_OK) {
            Uri selectedImage = imageUri;
            getContentResolver().notifyChange(selectedImage, null);
            ImageView imageView = (ImageView) findViewById(R.id.ImageView);
            ContentResolver cr = getContentResolver();
            Bitmap bitmap;
            try {
                 bitmap = android.provider.MediaStore.Images.Media
                 .getBitmap(cr, selectedImage);

                imageView.setImageBitmap(bitmap);
                Toast.makeText(this, selectedImage.toString(),
                        Toast.LENGTH_LONG).show();
            } catch (Exception e) {
                Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT)
                        .show();
                Log.e("Camera", e.toString());
            }
        }
    }
}

4
এটি দুর্দান্ত কাজ করে, যদিও আপনার প্রয়োজন হতে পারে: প্রাইভেট স্ট্যাটিক ইন TAKE_PICTURE = 1;
ক্রিস

11
গ্যালাক্সি এস
ফোনগুলিতে

4
কেন হার্ড কোডড 'android.media.action.IMAGE_CAPTURE'। এটি কিছু ফোনে কাজ নাও করতে পারে। এই জন্য কোন মান আছে? সম্ভবত ইন্টেন্টের কাছাকাছি কিছু somethingঅ্যাকশন_GET_CONTENT?
অ্যালিক্লিজিন-কিলাকা

7
@ কিলাকা, মিডিয়াস্টোর Aঅ্যাকশন_আইএমপিএকপ্যাচার
রব

4
আপনার FileProviderঅ্যান্ড্রয়েড> এম ব্যবহার করার দরকার হতে পারে এখানে
নিকোলাই ওয়েইটকম্পার

22

আমি এখানে পাওয়া নিম্নলিখিত চেষ্টা করুন

Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(intent, 0);

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (resultCode == Activity.RESULT_OK && requestCode == 0) {
    String result = data.toURI();
    // ...
  }
}

4
ধন্যবাদ তবে তোলা ছবি কোনও ডিভাইসে সংরক্ষণ করছে না তাই আমি উরি uri = Uri.parse (data.toURI ()) এ ফাইলনটফাউন্ডএক্সসেপশন পাচ্ছি; বিটম্যাপ = android.provider.MediaStore.Images.Media .getBitmap (কন্টেন্টসেসলভার, ইউরি);
আলেকজান্ডার ওলেনিকভ

আপনি কি বলছেন যে আপনি তোলা ছবিটি আপনার পছন্দ অনুসারে ফোন / ডিভাইসে সংরক্ষণ করা হচ্ছে না বা কোনও কিছু ঘটছে এবং আপনি নিজের ফোন / ডিভাইসে চিত্রটি সংরক্ষণ করতে বললেও এটি সংরক্ষণ করছে না এমন কাজ করে?
রায়ান

আমি বলছি যে ছবিটি ডিভাইসে স্বয়ংক্রিয়ভাবে সংরক্ষণ করা হচ্ছে না তবে এটিঅ্যাক্টিভিটিস রেজাল্ট () এ বিটম্যাপ হিসাবে ফিরে আসে। তবে আমি একটি সমাধান পেয়েছি যা আমি একটি উত্তরে উল্লেখ করব।
আলেকজান্ডার ওলেনিকভ

এটি আরও ভাল উত্তর। উপরের উত্তরটি চিত্রটির একটি অপ্রয়োজনীয় সদৃশ সংরক্ষণ করে। এটি ব্যবহারকারীর গ্যালারী অ্যাপ্লিকেশনটিতে একের পরিবর্তে দুটি চিত্র হিসাবে উপস্থিত হয়, যা বেশিরভাগ লোককে বাগ হিসাবে বিবেচনা করবে।
থমাস ডিগানান

7

এই কাজটি পেতে আমাকে কয়েক ঘন্টা সময় লেগেছে। কোডটি এটি প্রায় একটি স্বল্প পার্থক্য সহ, বিকাশকারী.অ্যান্ড্রয়েড ডট কম থেকে একটি অনুলিপি-পেস্ট ।

এই অনুমতিটির জন্য এখানে অনুরোধ করুন AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

আপনার Activity, এটি সংজ্ঞায়িত করে শুরু করুন:

static final int REQUEST_IMAGE_CAPTURE = 1;
private Bitmap mImageBitmap;
private String mCurrentPhotoPath;
private ImageView mImageView;

তারপরে Intentএটি একটি ফায়ার করুন onClick:

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getPackageManager()) != null) {
    // Create the File where the photo should go
    File photoFile = null;
    try {
        photoFile = createImageFile();
    } catch (IOException ex) {
        // Error occurred while creating the File
        Log.i(TAG, "IOException");
    }
    // Continue only if the File was successfully created
    if (photoFile != null) {
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
        startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE);
    }
}

নিম্নলিখিত সমর্থন পদ্ধতি যুক্ত করুন:

private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  // prefix
            ".jpg",         // suffix
            storageDir      // directory
    );

    // Save a file: path for use with ACTION_VIEW intents
    mCurrentPhotoPath = "file:" + image.getAbsolutePath();
    return image;
}

তারপরে ফলাফলটি গ্রহণ করুন:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        try {
            mImageBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath));
            mImageView.setImageBitmap(mImageBitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

এটি কীভাবে কাজ করেছে তা হ'ল MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath))যা ডেভেলপার.অ্যান্ড্রয়েড.কম থেকে কোড থেকে আলাদা । মূল কোডটি আমাকে একটি দিয়েছে FileNotFoundException


আমার জন্যও একই. আমার ধারণা আপনি কয়েক ঘন্টা আমাকে বাঁচিয়েছিলেন। কোনও ধারণা কেন অ্যান্ড্রয়েড ডি কোড আইও ব্যতিক্রম দিচ্ছে?
কুক

0

নীচের চেষ্টা করুন আমি এখানে একটি লিঙ্ক পাওয়া যায়

যদি আপনার অ্যাপ্লিকেশনটিকে এম এবং তদূর্ধ্ব লক্ষ্যবস্তু করে এবং ক্যামেরার অনুমতি ব্যবহার করা হিসাবে ঘোষণা করে যা মঞ্জুরিপ্রাপ্ত নয়, তবে এই ক্রিয়াটি ব্যবহারের চেষ্টা করার ফলে সুরক্ষা-গ্রহণের ফলস্বরূপ।

EasyImage.openCamera(Activity activity, int type);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    EasyImage.handleActivityResult(requestCode, resultCode, data, this, new DefaultCallback() {
        @Override
        public void onImagePickerError(Exception e, EasyImage.ImageSource source, int type) {
            //Some error handling
        }

        @Override
        public void onImagesPicked(List<File> imagesFiles, EasyImage.ImageSource source, int type) {
            //Handle the images
            onPhotosReturned(imagesFiles);
        }
    });
}

এই লাইব্রেরিতে ফটোগুলির জন্য আউটপুট পাথ নির্ধারণের কোনও উপায় নেই এবং এমন কিছু
ভ্লাদ

0

আমি এটি করার জন্য একটি খুব সহজ উপায় খুঁজে পেয়েছি। on clickফাংশনটি শুরু করতে শ্রোতার সাহায্যে এটি খুলতে একটি বোতাম ব্যবহার করুন openc():

String fileloc;
private void openc()
{
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File f = null;
    try 
    {
        f = File.createTempFile("temppic",".jpg",getApplicationContext().getCacheDir());
        if (takePictureIntent.resolveActivity(getPackageManager()) != null)
        {               
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,FileProvider.getUriForFile(profile.this, BuildConfig.APPLICATION_ID+".provider",f));
            fileloc = Uri.fromFile(f)+"";
            Log.d("texts", "openc: "+fileloc);
            startActivityForResult(takePictureIntent, 3);
        }
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 3 && resultCode == RESULT_OK) {
        Log.d("texts", "onActivityResult: "+fileloc);
        // fileloc is the uri of the file so do whatever with it
    }
}

আপনি uriঅবস্থানের স্ট্রিং দিয়ে যা খুশি করতে পারেন । উদাহরণস্বরূপ, আমি চিত্রটি ক্রপ করার জন্য এটি একটি চিত্র ক্রপপারের কাছে প্রেরণ করি।


-3

এই কোড চেষ্টা করুন

Intent photo= new Intent("android.media.action.IMAGE_CAPTURE");
                    startActivityForResult(photo, CAMERA_PIC_REQUEST);

6
এই পোস্টটি স্বয়ংক্রিয়ভাবে নিম্ন মানের হিসাবে পতাকাঙ্কিত হচ্ছে কারণ এটি কেবল কোড। সমস্যাটি কীভাবে সমাধান করে তা ব্যাখ্যা করার জন্য কিছু পাঠ্য যোগ করে আপনি কি এটি প্রসারিত করতে আপত্তি করবেন?
গুং - মনিকা পুনরায়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.