অ্যান্ড্রয়েড ক্যামেরা: ডেটা অভিপ্রায় বাতিল


132

আমার একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন রয়েছে যাতে একাধিক ক্রিয়াকলাপ রয়েছে।

এর মধ্যে একটিতে আমি একটি বোতাম ব্যবহার করছি যা ডিভাইস ক্যামেরাকে কল করবে:

public void onClick(View view) {
    Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(photoIntent, IMAGE_CAPTURE);
}

একই ক্রিয়াকলাপে আমি OnActivityResultচিত্রের ফলাফলের জন্য পদ্ধতিটি কল করি :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == IMAGE_CAPTURE) {
        if (resultCode == RESULT_OK) {
            Bitmap image = (Bitmap) data.getExtras().get("data");
            ImageView imageview = (ImageView) findViewById(R.id.pic);
            imageview.setImageBitmap(image);
        } else if (resultCode == RESULT_CANCELED) {
            Toast.makeText(this, "CANCELED ", Toast.LENGTH_LONG).show();
        }
    }
}

সমস্যাটি হ'ল উদ্দেশ্যটি dataশূন্য হয় এবং OnActivityResultপদ্ধতিটি সরাসরি দিকে ফিরে যায় (resultCode == RESULT_CANCELED)এবং অ্যাপ্লিকেশনটি পূর্ববর্তী অ্যাভিটিটিতে ফিরে আসে।

আমি কীভাবে এই সমস্যাটি ঠিক করতে পারি এবং ক্যামেরাটি কল করার পরে, অ্যাপ্লিকেশনটি বর্তমান ক্রিয়াকলাপে ফিরে আসে ImageViewযার মধ্যে থাকা ছবিটি থাকবে?

ধন্যবাদ


উত্তর:


218

ডিফল্ট অ্যান্ড্রয়েড ক্যামেরা অ্যাপ্লিকেশন কেবল প্রত্যাবর্তিত ইনসেন্টটিতে থাম্বনেলটি পাস করার সময় একটি নন-নাল অভিপ্রায় দেয়। আপনি যদি EXTRA_OUTPUTকোনও ইউআরআই দিয়ে লেখার জন্য পাস করেন তবে এটি একটি nullঅভিপ্রায় ফিরে আসবে এবং ছবিটি আপনি যে ইউআরআই দিয়ে গেছেন সেটিতে রয়েছে।

আপনি গিটহাবে ক্যামেরা অ্যাপের উত্স কোডটি দেখে এটি যাচাই করতে পারেন:

আমি অনুমান করব যে আপনি হয় EXTRA_OUTPUTকোনওভাবে পাস করছেন , বা আপনার ফোনের ক্যামেরা অ্যাপটি অন্যভাবে কাজ করে works


12
অ্যাক্টিভিটিস রিসাল্ট
আবদুল ওয়াহাব

সত্যিই সহায়ক উত্তর আমি আশা করি অন্যদের পক্ষে সমাধানটি আরও দক্ষতার সাথে খুঁজে পেতে আমি এটি গ্রহণ করতে পারি।
ব্যবহারকারী 1160020

1
অসাধারণ ! ব্যাখ্যার জন্য অনেক ধন্যবাদ :) +100
মুহাম্মদ রিয়াজ

আপনার পোস্ট করা লিঙ্কটি আর বৈধ নয়।

4
আমরা কি ক্যামেরা ক্লাসটি চালু করতে পারি এবং উভয়কেই অনুমতি দেওয়ার জন্য কেবল একটি পদ্ধতিটি পরিবর্তন করতে পারি, না এরপরে আরও শক্ত?
ট্যানার গ্রীষ্মকাল

16

আমি একটি সহজ উত্তর খুঁজে পেয়েছি। এটা কাজ করে !!

private void openCameraForResult(int requestCode){
    Intent photo = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    Uri uri  = Uri.parse("file:///sdcard/photo.jpg");
    photo.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri);
    startActivityForResult(photo,requestCode);
}

if (requestCode == CAMERA_REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {
            File file = new File(Environment.getExternalStorageDirectory().getPath(), "photo.jpg");
            Uri uri = Uri.fromFile(file);
            Bitmap bitmap;
            try {
                bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                bitmap = cropAndScale(bitmap, 300); // if you mind scaling
                profileImageView.setImageBitmap(bitmap);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

আপনি যদি এই চিত্রটি ক্রপ এবং স্কেল করতে চান

public static  Bitmap cropAndScale (Bitmap source, int scale){
    int factor = source.getHeight() <= source.getWidth() ? source.getHeight(): source.getWidth();
    int longer = source.getHeight() >= source.getWidth() ? source.getHeight(): source.getWidth();
    int x = source.getHeight() >= source.getWidth() ?0:(longer-factor)/2;
    int y = source.getHeight() <= source.getWidth() ?0:(longer-factor)/2;
    source = Bitmap.createBitmap(source, x, y, factor, factor);
    source = Bitmap.createScaledBitmap(source, scale, scale, false);
    return source;
}

4
এটি একটি FileUriExposedExceptionআধুনিক এসডিকে সংস্করণ দেয় ।
সৌরদীপ নন্দ

8

আমি এই সমস্যাটি অনুভব করেছি, এটি intentশূন্য নয় তবে এর মাধ্যমে প্রেরিত তথ্য intentপাওয়া যায় নাonActionActivit()

এখানে চিত্র বর্ণনা লিখুন

এটি getContentResolver () ব্যবহার করে একটি আরও ভাল সমাধান :

    private Uri imageUri;
    private ImageView myImageView;
    private Bitmap thumbnail;

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

      ...
      ...    
      ...
      myImageview = (ImageView) findViewById(R.id.pic); 

      values = new ContentValues();
      values.put(MediaStore.Images.Media.TITLE, "MyPicture");
      values.put(MediaStore.Images.Media.DESCRIPTION, "Photo taken on " + System.currentTimeMillis());
      imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
      startActivityForResult(intent, PICTURE_RESULT);

  }

onActivityResult()দ্বারা সঞ্চিত একটি বিটম্যাপ পেতে getContentResolver () :

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

        if (requestCode == REQUEST_CODE_TAKE_PHOTO && resultCode == RESULT_OK) {

            Bitmap bitmap;
            try {
                bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
                myImageView.setImageBitmap(bitmap);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

পরিচয়পত্র পরিচয়পত্র

গিথুবে আমার উদাহরণটি পরীক্ষা করুন:

https://github.com/Jorgesys/TakePicture


6

নাল অভিপ্রায় সমস্যা এড়ানো সহজ ওয়ার্কিং ক্যামেরা অ্যাপ

- সমস্ত উত্তর কোড এই উত্তর অন্তর্ভুক্ত; অ্যান্ড্রয়েড টিউটোরিয়াল কাছাকাছি

আমি এই ইস্যুতে প্রচুর সময় ব্যয় করছি, তাই আমি একটি অ্যাকাউন্ট তৈরি করে আমার ফলাফলগুলি আপনার সাথে ভাগ করে নেওয়ার সিদ্ধান্ত নিয়েছি।

অফিসিয়াল অ্যান্ড্রয়েড টিউটোরিয়াল "ফটো তোলা সহজভাবে" প্রমাণিত হয়েছিল যে এটি প্রতিশ্রুতি দিয়েছিল তা পুরোপুরি না ধরে। সেখানে প্রদত্ত কোডটি আমার ডিভাইসে কাজ করে নি: একটি স্যামসং গ্যালাক্সি এস 4 মিনি জিটি-আই 9195 অ্যান্ড্রয়েড সংস্করণ 4.4.2 / কিটকেট / এপিআই স্তর 19 চালাচ্ছে।

আমি বুঝতে পেরেছি যে ছবিটি ক্যাপচার করার সময় মূল সমস্যাটি হ'ল পদ্ধতিটির নিম্নলিখিত লাইনটি ছিল ( dispatchTakePictureIntentটিউটোরিয়ালে):

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);

ফলস্বরূপ শূন্য হয়ে ধরা পরে এটির উদ্দেশ্য হয়েছিল onActivityResult

এই সমস্যা সমাধানের জন্য, আমি এখানে পূর্বের উত্তরগুলি বাইরে অনেক অনুপ্রেরণা টানা এবং GitHub উপর কিছু সহায়ক পোস্ট (বেশিরভাগই deepwinter দ্বারা এই এক - তাঁকে অনেক ধন্যবাদ; আপনি যদি একটি ঘনিষ্ঠভাবে সম্পর্কিত তার উত্তর খুঁজে বার করো করতে চাইতে পারেন পোস্টটি ভাল হিসাবে)।

এই আনন্দদায়ক পরামর্শ অনুসরণ করে, আমি উল্লিখিত putExtraলাইনটি মুছে ফেলার এবং তার পরিবর্তে onctivityResult () পদ্ধতির মধ্যে ক্যামেরা থেকে তোলা ছবিটি ফিরিয়ে আনতে সম্পর্কিত জিনিসটি বেছে নিয়েছি। ছবির সাথে যুক্ত বিটম্যাপটি ফিরে পেতে কোডের সিদ্ধান্ত নেওয়া লাইনগুলি হ'ল:

        Uri uri = intent.getData();
        Bitmap bitmap = null;
        try {
            bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
        } catch (IOException e) {
            e.printStackTrace();
        }

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

কার্যকলাপ_মাইন.এক্সএমএল:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.android.simpleworkingcameraapp.MainActivity">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="takePicAndDisplayIt"
    android:text="Take a pic and display it." />

<ImageView
    android:id="@+id/image1"
    android:layout_width="match_parent"
    android:layout_height="200dp" />

</LinearLayout>

মেইনএ্যাকটিভিটি.জভা:

package com.example.android.simpleworkingcameraapp;

import android.content.Intent;
import android.graphics.Bitmap;
import android.media.Image;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

private ImageView image;
static final int REQUEST_TAKE_PHOTO = 1;
String mCurrentPhotoPath;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    image = (ImageView) findViewById(R.id.image1);
}

// copied from the android development pages; just added a Toast to show the storage location
private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmm").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );

    // Save a file: path for use with ACTION_VIEW intents
    mCurrentPhotoPath = image.getAbsolutePath();
    Toast.makeText(this, mCurrentPhotoPath, Toast.LENGTH_LONG).show();
    return image;
}

public void takePicAndDisplayIt(View view) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (intent.resolveActivity(getPackageManager()) != null) {
        File file = null;
        try {
            file = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File
        }

        startActivityForResult(intent, REQUEST_TAKE_PHOTO);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultcode, Intent intent) {
    if (requestCode == REQUEST_TAKE_PHOTO && resultcode == RESULT_OK) {
        Uri uri = intent.getData();
        Bitmap bitmap = null;
        try {
            bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
        } catch (IOException e) {
            e.printStackTrace();
        }
        image.setImageBitmap(bitmap);
    }
}
}

অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.simpleworkingcameraapp">


<!--only added paragraph-->
<uses-feature
    android:name="android.hardware.camera"
    android:required="true" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  <!-- only crucial line to add; for me it still worked without the other lines in this paragraph -->
<uses-permission android:name="android.permission.CAMERA" />


<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

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

এ ছাড়াও এটি উল্লেখ করা মূল্যবান হতে পারে যে অ্যান্ড্রয়েড স্টুডিওর অটোমপোর্ট হ্যান্ডলিং করতে সক্ষম হতে পারে না java.text.SimpleDateFormatএবং java.util.Date। আমাকে দুটোই নিজে আমদানি করতে হয়েছিল।


এই সমাধানগুলির জন্য স্টোরের অনুমতি প্রয়োজন, যা খুব ভাল পদ্ধতির নয়।
শানরাইশান

4
প্রশ্নটি পরিষ্কারভাবে বলেছে যে "ডেটা" নামক ইনটেন্ট প্যারামিটারটিঅ্যাক্টিভিটিস রেজাল্ট () এ পাস হয়েছে তবে আপনার সমাধানটি পরে এগিয়ে যায় এবং এটি ব্যবহার করার চেষ্টা করে।
মাকস

2

সম্ভবত আপনার কিছু এরকম ছিল বলে?

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);                        
Uri fileUri =  CommonUtilities.getTBCameraOutputMediaFileUri();                  
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);                        
startActivityForResult(takePictureIntent, 2);

তবে আপনাকে অবশ্যই অতিরিক্ত আউটপুটটিকে অভিপ্রায় স্থাপন করা উচিত নয়, কারণ এরপরে ডেটা ভেরিয়েবলের পরিবর্তে ডেটা ইউআরআইতে যায়। যে কারণে, আপনি মাঝখানে দুটি লাইন নিতে হবে, যাতে আপনার আছে

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePictureIntent, 2);

এটাই আমার জন্য সমস্যা সৃষ্টি করেছিল, আশা করি এটি সাহায্য করেছিল।


12
এই উত্তরটি বিভ্রান্তিকর। মিডিয়াস্টোর না রেখে আপনি পূর্ণ আকারের ছবির পরিবর্তে একটি থাম্বনেইল পাবেন EXT এটি ডক্স এবং অন্যান্য উত্তরে হাইলাইট করা হয়েছে।
ব্যবহারকারী 2417480

2
অবশ্যই এই উত্তরটি বিভ্রান্তিকর।
সূচিপত্রহীন বিকাশকারীরা এক্সপশন

এটি একটি বিভ্রান্তিমূলক উত্তর।
আবদুল্লা থানসীহ

0

নিম্নলিখিত কোডটি আমার পক্ষে কাজ করে:

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, 2);

এবং ফলাফল এখানে:

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent)
{ 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

    if(resultCode == RESULT_OK)
    {
        Uri selectedImage = imageReturnedIntent.getData();
        ImageView photo = (ImageView) findViewById(R.id.add_contact_label_photo);
        Bitmap mBitmap = null;
        try
        {
            mBitmap = Media.getBitmap(this.getContentResolver(), selectedImage);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

আমি এটি পরীক্ষা করেছি তবে এটি একই সমস্যা :(
সফট_ডিভলপার

1
আমি imageReturnedIntent.getData()মান নাল করছি। আমি আপনার মত একই উদ্দেশ্য তৈরি করছি। কোনও অতিরিক্ত প্যারাম লাগায় না।
জয়দীপ কালকানি

0

ক্যামেরা অ্যাক্সেস করতে এবং ছবি তুলতে এবং অ্যান্ড্রয়েডতে চিত্রকল্পটি সেট করতে

Uri file = Uri.fromFile(getOutputMediaFile());মার্শমালোয়ের জন্য আপনাকে ব্যবহার করতে হবে ।

পাথ পেতে নীচের লিঙ্কটি ব্যবহার করুন

https://androidkennel.org/android-camera-access-tutorial/


0

কোটলিন কোড যা আমার পক্ষে কাজ করে:

 private fun takePhotoFromCamera() {
          val intent = Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE)
        startActivityForResult(intent, PERMISSIONS_REQUEST_TAKE_PICTURE_CAMERA)
      }

এবং ফলাফল পান:

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
 if (requestCode == PERMISSIONS_REQUEST_TAKE_PICTURE_CAMERA) {
         if (resultCode == Activity.RESULT_OK) {
           val photo: Bitmap? =  MediaStore.Images.Media.getBitmap(this.contentResolver, Uri.parse( data!!.dataString)   )
            // Do something here : set image to an ImageView or save it ..   
              imgV_pic.imageBitmap = photo 
        } else if (resultCode == Activity.RESULT_CANCELED) {
            Log.i(TAG, "Camera  , RESULT_CANCELED ")
        }

    }

}

এবং অনুরোধ কোড ঘোষণা করতে ভুলবেন না:

companion object {
 const val PERMISSIONS_REQUEST_TAKE_PICTURE_CAMERA = 300
  }

0

অনেক চেষ্টা এবং অধ্যয়নের পরে, আমি এটি বের করতে সক্ষম হয়েছি। প্রথমত, ইনটেন্টের ভেরিয়েবল ডেটা সবসময় নাল থেকে যায় তাই অতএব, চেক করা !nullআপনার অ্যাপ্লিকেশনটি ক্র্যাশ করবে এতক্ষণ আপনি স্টার্টঅ্যাক্টিভিটি ফর রিসাল্টে ইউআরআই পাস করছেন below নীচের উদাহরণটি অনুসরণ করুন। আমি কোটলিন ব্যবহার করব।

  1. ক্যামেরা অভিপ্রায় খুলুন

    fun addBathroomPhoto(){
    addbathroomphoto.setOnClickListener{
    
        request_capture_image=2
    
        var takePictureIntent:Intent?
        takePictureIntent =Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        if(takePictureIntent.resolveActivity(activity?.getPackageManager()) != null){
    
            val photoFile: File? = try {
                createImageFile()
            } catch (ex: IOException) {
                // Error occurred while creating the File
    
                null
            }
    
            if (photoFile != null) {
                val photoURI: Uri = FileProvider.getUriForFile(
                    activity!!,
                    "ogavenue.ng.hotelroomkeeping.fileprovider",photoFile)
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                    photoURI);
                startActivityForResult(takePictureIntent,
                    request_capture_image);
            }
    
    
        }
    
    }

    } `

  2. ক্রেডিট ইমেজফাইল () তৈরি করুন But তবে আপনাকে অবশ্যই চিত্রের ফাইলপ্যাথটি পরিবর্তনশীল গ্লোবাল করে তুলতে হবে। এটি কীভাবে তৈরি করা যায় তার উদাহরণ অ্যান্ড্রয়েড অফিসিয়াল ডকুমেন্টেশন এবং বেশ সোজা

  3. অভিপ্রায় পান

     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    
    if (requestCode == 1 && resultCode == RESULT_OK) {
        add_room_photo_txt.text=""
        var myBitmap=BitmapFactory.decodeFile(imageFilePath)
        addroomphoto.setImageBitmap(myBitmap)
        var file=File(imageFilePath)
        var fis=FileInputStream(file)
        var bm = BitmapFactory.decodeStream(fis);
        roomphoto=getBytesFromBitmap(bm) }}
  4. GetBytesFromBitmap পদ্ধতি

      fun getBytesFromBitmap(bitmap:Bitmap):ByteArray{
    
      var stream=ByteArrayOutputStream()
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
      return stream.toByteArray();
      }

আশা করি এটা কাজে লাগবে.


0

যখন আমরা ক্যামেরা থেকে অ্যান্ড্রয়েডে ছবিটি ক্যাপচার করব তখন উরি বা নালাগুলি data.getdata()আসবে। এই সমস্যাটি সমাধান করার জন্য আমাদের দুটি সমাধান রয়েছে।

  1. আমরা বিটম্যাপ চিত্র থেকে উরি পথটি পেতে পারি
  2. আমরা কার্সার থেকে উরি পথ পেতে পারি।

আমি এখানে সমস্ত পদ্ধতি প্রয়োগ করব, দয়া করে সাবধানে এগুলি দেখুন এবং পড়ুন: -

প্রথমে আমি বলব কীভাবে বিটম্যাপ চিত্র থেকে উরি পাবেন: সম্পূর্ণ কোডটি হ'ল:

প্রথমে আমরা ইন্টেন্টের মাধ্যমে চিত্রটি ক্যাপচার করব যা উভয় পদ্ধতির জন্য একই রকম হবে তাই এই কোডটি আমি এখানে কেবল একটি সময় লিখব:

// Capture Image
captureImg.setOnClickListener(new View.OnClickListener(){
    @Override public void onClick(View view){
        Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if(intent.resolveActivity(getPackageManager())!=null){
            startActivityForResult(intent,reqcode);
        }

    }
});  

এখন আমরা অন-অ্যাক্টিভিটি রেজাল্ট প্রয়োগ করব :-( এটি উপরোক্ত 2 টি পদ্ধতির জন্য একই হবে): -

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

    if (requestCode == reqcode && resultCode == RESULT_OK)
    {

        Bitmap photo = (Bitmap) data.getExtras().get("data");
        ImageView.setImageBitmap(photo);

        // CALL THIS METHOD TO GET THE URI FROM THE BITMAP
        Uri tempUri = getImageUri(getApplicationContext(), photo);

        //Show Uri path based on Image
        Toast.makeText(LiveImage.this, "Here " + tempUri, Toast.LENGTH_LONG).show();

        //Show Uri path based on Cursor Content Resolver
        Toast.makeText(this, "Real path for URI : " + getRealPathFromURI(tempUri), Toast.LENGTH_SHORT).show();
    }
    else
    {
        Toast.makeText(this, "Failed To Capture Image", Toast.LENGTH_SHORT).show();
    }
}     

ক্লাসের মাধ্যমে আমরা ইমেজ এবং কার্সার পদ্ধতিগুলি থেকে উরি তৈরি করতে উপরের সমস্ত পদ্ধতি তৈরি করব:

বিটম্যাপ চিত্র থেকে এখন ইউআরআই পথ path

private Uri getImageUri(Context applicationContext, Bitmap photo)
{
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    photo.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(LiveImage.this.getContentResolver(), photo, "Title", null);
    return Uri.parse(path);
}

Saved সংরক্ষিত চিত্রের আসল পথ থেকে উরি

public String getRealPathFromURI(Uri uri)
{
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    return cursor.getString(idx);
}

-1

আমরা যখন ক্যামেরা থেকে অ্যান্ড্রয়েডে ছবিটি ক্যাপচার করি তখন Uriবা data.getdata()নাল হয়ে যায়। এই সমস্যাটি সমাধান করার জন্য আমাদের দুটি সমাধান রয়েছে।

  1. বিটম্যাপ চিত্র থেকে উরি পথটি পুনরুদ্ধার করুন
  2. কার্সার থেকে উরি পথটি পুনরুদ্ধার করুন।

এইভাবে বিটম্যাপ চিত্র থেকে উরিটি পুনরুদ্ধার করবেন। ইন্টেন্টের মাধ্যমে প্রথম চিত্রটি ক্যাপচার করুন যা উভয় পদ্ধতির জন্য একই হবে:

// Capture Image
captureImg.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(intent, reqcode);
        }
    }
});

এখন বাস্তবায়ন করুন OnActivityResult, যা উভয় পদ্ধতির জন্য একই হবে:

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

    if(requestCode==reqcode && resultCode==RESULT_OK)
    {
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        ImageView.setImageBitmap(photo);

        // CALL THIS METHOD TO GET THE URI FROM THE BITMAP
        Uri tempUri = getImageUri(getApplicationContext(), photo);

        // Show Uri path based on Image
        Toast.makeText(LiveImage.this,"Here "+ tempUri, Toast.LENGTH_LONG).show();

        // Show Uri path based on Cursor Content Resolver
        Toast.makeText(this, "Real path for URI : "+getRealPathFromURI(tempUri), Toast.LENGTH_SHORT).show();
    }
    else
    {
        Toast.makeText(this, "Failed To Capture Image", Toast.LENGTH_SHORT).show();
    }
}

চিত্র এবং কার্সার পদ্ধতিগুলি থেকে উরি তৈরি করতে এখন উপরের সমস্ত পদ্ধতি তৈরি করুন:

বিটম্যাপ চিত্র থেকে উরি পথ:

private Uri getImageUri(Context applicationContext, Bitmap photo) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    photo.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(LiveImage.this.getContentResolver(), photo, "Title", null);
    return Uri.parse(path);
}

সংরক্ষিত চিত্রের আসল পথ থেকে উরি:

public String getRealPathFromURI(Uri uri) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    return cursor.getString(idx);
}

কেউ কি এই সমাধান করতে সক্ষম হয়েছে? দয়া করে আপনার সমাধান পোস্ট করুন। অ্যান্ড্রয়েড ডক স্পষ্টতই এটি সমাধান করতে সক্ষম হয়েছে
Gstuntz
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.