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


163

আমরা ব্যবহারকারীকে নতুন ছবি তোলার জন্য নেটিভ ক্যামেরা অ্যাপটি ব্যবহার করার চেষ্টা করছি। এটি ঠিকঠাক কাজ করে যদি আমরা এটি ছেড়ে চলে যাই EXTRA_OUTPUT extraএবং ছোট বিটম্যাপ চিত্রটি ফিরিয়ে আনি। তবে আমরা putExtra(EXTRA_OUTPUT,...)এটি শুরু করার আগে যদি অভিপ্রায় নিয়ে থাকি তবে আপনি ক্যামেরা অ্যাপের "ওকে" বোতামটি আঘাত করার চেষ্টা না করা পর্যন্ত সবকিছু কাজ করে। "ওকে" বোতামটি কিছুই করে না। ক্যামেরা অ্যাপটি খোলা থাকে এবং কিছুই লক হয় না। আমরা এটি থেকে বাতিল করতে পারি, তবে ফাইলটি কখনই লেখা হয় না। ACTION_IMAGE_CAPTUREকোনও ফাইলে তোলা ছবিটি লেখার জন্য আমাদের ঠিক কী করতে হবে ?

সম্পাদনা করুন: এটি MediaStore.ACTION_IMAGE_CAPTUREপরিষ্কার করার জন্য অভিপ্রায়ের মাধ্যমে করা হয়

উত্তর:


144

এটি অ্যান্ড্রয়েডের কয়েকটি সংস্করণে একটি ভাল ডকুমেন্টেড বাগ । এটি হ'ল গুগল এন্ড্রয়েডের অভিজ্ঞতা নিয়ে ইমেজ ক্যাপচার ডকুমেন্ট হিসাবে কাজ করে না। আমি সাধারণত যা ব্যবহার করেছি এটি একটি ইউটিলিটি ক্লাসে এরকমই।

public boolean hasImageCaptureBug() {

    // list of known devices that have the bug
    ArrayList<String> devices = new ArrayList<String>();
    devices.add("android-devphone1/dream_devphone/dream");
    devices.add("generic/sdk/generic");
    devices.add("vodafone/vfpioneer/sapphire");
    devices.add("tmobile/kila/dream");
    devices.add("verizon/voles/sholes");
    devices.add("google_ion/google_ion/sapphire");

    return devices.contains(android.os.Build.BRAND + "/" + android.os.Build.PRODUCT + "/"
            + android.os.Build.DEVICE);

}

তারপরে আমি যখন চিত্র ক্যাপচার চালু করি তখন আমি একটি অভিপ্রায় তৈরি করি যা বাগটি পরীক্ষা করে।

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
if (hasImageCaptureBug()) {
    i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File("/sdcard/tmp")));
} else {
    i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
}
startActivityForResult(i, mRequestCode);

তারপরে যে ক্রিয়ায় আমি ফিরে আসি, আমি ডিভাইসের উপর ভিত্তি করে বিভিন্ন জিনিস করি।

protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
     switch (requestCode) {
         case GlobalConstants.IMAGE_CAPTURE:
             Uri u;
             if (hasImageCaptureBug()) {
                 File fi = new File("/sdcard/tmp");
                 try {
                     u = Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(), fi.getAbsolutePath(), null, null));
                     if (!fi.delete()) {
                         Log.i("logMarker", "Failed to delete " + fi);
                     }
                 } catch (FileNotFoundException e) {
                     e.printStackTrace();
                 }
             } else {
                u = intent.getData();
            }
    }

এটি আপনাকে নতুন ক্যামেরা অ্যাপ্লিকেশন লিখতে বাঁচায়, তবে এই কোডটি দুর্দান্ত নয়। বড় সমস্যা হ'ল

  1. আপনি বাগ সহ কখনই ডিভাইসগুলি থেকে পূর্ণ আকারের চিত্র পাবেন না। আপনি 512px প্রশস্ত চিত্রগুলি পান যা চিত্র সামগ্রী সরবরাহকারীর মধ্যে .োকানো হয়। বাগ ছাড়াই থাকা ডিভাইসগুলিতে, সমস্ত কিছু ডকুমেন্ট হিসাবে কাজ করে, আপনি একটি বড় সাধারণ ছবি পাবেন।

  2. আপনি তালিকা বজায় রাখতে হবে। লিখিত হিসাবে, ডিভাইসগুলির জন্য অ্যান্ড্রয়েডের একটি সংস্করণ ( সায়ানোজেনমডস বিল্ডগুলি বলুন ) দিয়ে বাগ ফিক্সড দিয়ে ফ্ল্যাশ করা সম্ভব । যদি এটি হয়, আপনার কোড ক্রাশ হবে। ফিক্সটি হ'ল পুরো ডিভাইস ফিঙ্গারপ্রিন্ট ব্যবহার করা।


21
গ্যালাক্সি এস-তে: ইন্টেন্ট.জেটডেটা () নালাগুলি দেয় এবং তদুপরি, গ্যালাক্সি এস-এ ক্যামেরা অ্যাপ্লিকেশন নিজেই গ্যালারিতে নতুন ছবি serোকায়, তবে কোনও ইউরি ফিরে আসেনি। সুতরাং আপনি যদি ফাইল থেকে গ্যালারীটিতে ফটো ,োকান, সেখানে নকল ফটো থাকবে।
আর্সেনিয়

1
আরে আমার ডিভাইসটি এখানে তালিকাভুক্ত নয় এবং আমি আপনার পদ্ধতিতে প্রয়োগ করেছি ut তবে আমার আবেদনটি এখনও ক্র্যাশ করছে আমি কারণটি বুঝতে পারি না lease দয়া করে আমাকে সহায়তা করুন
গীতাঞ্জলি

এই কোডটি ড্রয়েড-এক্স এবং সনি এক্সফেরিয়া ডিভাইসে ব্যবহার করে। উভয় ডিভাইসই নাল হিসাবে ইন্টেন্ট মানটি ফেরত দেয়। এছাড়াও ড্রয়েডেক্স ফলাফল হিসাবে কোড 0 প্রদান করে এক্সফেরিয়া ফলাফল-কোড হিসাবে -1 হিসাবে দেয় returns কেন যে কেস হতে হবে যে কেউ জানেন।
rrlig

5
"ভাল ডকুমেন্টেড বাগ" এর লিঙ্কটি যা ইয়ানোকার জবাবের শুরুতে রয়েছে is সেই বাগটি পুটেক্সট্রা
ফ্রাঙ্ক হার্পার

code.google.com/p/android/issues/detail?id=1480 আচ্ছা, তাহলে আপনি কীভাবে এটি ব্যাখ্যা করবেন?
পেনসিলচেক

50

আমি জানি এটির আগেও উত্তর দেওয়া হয়েছে তবে আমি জানি অনেক লোক এতে বিভ্রান্ত হয়, তাই আমি একটি মন্তব্য যুক্ত করতে চলেছি।

আমার ঠিক একই সমস্যাটি আমার নেক্সাস ওনে ঘটেছে। এটি ক্যামেরা অ্যাপ্লিকেশন শুরু হওয়ার আগে ডিস্কে বিদ্যমান ফাইল থেকে ছিল। অতএব, আমি নিশ্চিত করেছি যে বিদ্যমান ফাইলটি ক্যামেরা অ্যাপ্লিকেশন শুরু করার আগে। এখানে আমি ব্যবহার করেছি কিছু নমুনা কোড:

String storageState = Environment.getExternalStorageState();
        if(storageState.equals(Environment.MEDIA_MOUNTED)) {

            String path = Environment.getExternalStorageDirectory().getName() + File.separatorChar + "Android/data/" + MainActivity.this.getPackageName() + "/files/" + md5(upc) + ".jpg";
            _photoFile = new File(path);
            try {
                if(_photoFile.exists() == false) {
                    _photoFile.getParentFile().mkdirs();
                    _photoFile.createNewFile();
                }

            } catch (IOException e) {
                Log.e(TAG, "Could not create file.", e);
            }
            Log.i(TAG, path);

            _fileUri = Uri.fromFile(_photoFile);
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE );
            intent.putExtra( MediaStore.EXTRA_OUTPUT, _fileUri);
            startActivityForResult(intent, TAKE_PICTURE);
        }   else {
            new AlertDialog.Builder(MainActivity.this)
            .setMessage("External Storeage (SD Card) is required.\n\nCurrent state: " + storageState)
            .setCancelable(true).create().show();
        }

আমি প্রথমে MD5 হ্যাশ ব্যবহার করে একটি অনন্য (কিছুটা) ফাইলের নাম তৈরি করে উপযুক্ত ফোল্ডারে রেখেছি। তারপরে আমি এটি উপস্থিত কিনা তা পরীক্ষা করে দেখি (এটি হওয়া উচিত নয়, তবে এটির জন্য ভাল পরীক্ষা করা উচিত)। যদি এটির অস্তিত্ব না থাকে তবে আমি প্যারেন্ট দির (একটি ফোল্ডার) পাই এবং এটি পর্যন্ত ফোল্ডারটি স্তরক্রম তৈরি করি (সুতরাং যদি ফাইলের অবস্থানের দিকে ফোল্ডারগুলি উপস্থিত না থাকে তবে তারা এই লাইনের পরে থাকবে after তারপরে) আমি ফাইলটি তৈরি করি the ফাইলটি তৈরি হয়ে গেলে আমি উরি পেয়ে তা অভিপ্রায় পাস করি এবং তারপরে ঠিক আছে বোতামটি প্রত্যাশা অনুযায়ী কাজ করে এবং সবগুলি সোনালি।

এখন, যখন ওকে বাটনটি ক্যামেরা অ্যাপে টিপানো হবে তখন ফাইলটি প্রদত্ত অবস্থানে উপস্থিত থাকবে। এই উদাহরণে এটি হবে / এসডকার্ড / অ্যান্ড্রয়েড / ডেটা / কম.এক্সামেল.মায়াপ্প / ফাইলস / ২৩৪ এসডিউই ২৩৯৯৮ad.jpg

উপরের পোস্ট অনুসারে "অনঅ্যাক্টিভিটি রেজাল্ট" এ ফাইলটি অনুলিপি করার দরকার নেই।


13
আপনি <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />যদি অ্যান্ড্রয়েড 1.5 এর চেয়েও বেশি নতুন ব্যবহার করে থাকেন তবে আপনার ম্যানিফেস্টে তা নিশ্চিত হয়ে নিন - ক্যামেরা স্টাফ ডিবাগ করার জন্য কয়েক ঘন্টা ব্যয় করেছেন এবং এটি অন্তর্ভুক্ত ছিল না যাতে আমার সংরক্ষণগুলি সর্বদা ব্যর্থ হয়।
সোয়ানসন

এটি আমার পক্ষে ভাল কাজ করে তবে প্রতি প্রায় 10 টি চিত্র বা তার পরে, ফাঁকা ফাইলটি ওভাররাইট করা হয় না এবং আমি 0 বাইট ফাইল দিয়ে শেষ করি যেখানে চিত্রটি হওয়া উচিত। এটি খুব বিরক্তিকর এবং ট্র্যাক ডাউন ছিল শক্ত।
joey_g216

2
যেমন Jelly Bean সঙ্গে Nexus 7 কিছু ডিভাইস, থাকাকালীন আপনি Environment.getExternalStorageDirectory () পরিবর্তন করতে হবে getName () .getName () এর পরিবর্তে .getAbsolutePath (ব্যবহার করতে)।
কিথ

35

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

mPhotoUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
            new ContentValues());
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);
startActivityForResult(intent,CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE_CONTENT_RESOLVER);

আলোচনায় আরও অবদান রাখতে এবং নতুনদের সাহায্য করতে আমি একটি নমুনা / পরীক্ষা অ্যাপ্লিকেশন তৈরি করেছি যা ফটো ক্যাপচার বাস্তবায়নের জন্য বিভিন্ন কৌশল দেখায়। অন্যান্য বাস্তবায়নের অবদানগুলি অবশ্যই আলোচনায় যুক্ত হতে উত্সাহিত করা হয়েছে।

https://github.com/deepwinter/AndroidCameraTester


এই দুর্দান্ত ছিল। আমি এখনও আমার সমস্ত ডিভাইসগুলিতে এটি পরীক্ষা করতে পেরেছি, তবে আমি ধরে নিচ্ছি যে আপনি ইতিমধ্যে এতটা কিছু করেছেন। এই বিষয়টিতে প্রচুর শব্দ আছে এবং এই নির্দিষ্ট উত্তরটি এত সহজ এবং পরিষ্কার। এখন পর্যন্ত নেক্সাস 5 এ কাজ করা হয়েছে, যেখানে আমি প্রথমে প্রচুর রিপোর্ট পেয়েছি যে ACTION_IMAGE_CAPTURE এক্সট্রা_উইউপিটিউট ছাড়া কাজ করছে না। আমি আশা করি এটি পুরো বোর্ড জুড়ে কাজ করে, তবে এখনও পর্যন্ত খুব ভাল। থেক্স
ধনী

1
@ ডিডিউইন্টার - ধন্যবাদ স্যার। আমি আমার চুলগুলি টেনে আনছিলাম তবে আপনার বিষয়বস্তু সমাধানের সমাধানটি আমার যে সমস্ত সমস্যাযুক্ত পরিস্থিতিতে হয়েছে তার উপর ভাল কাজ করে।
বিলি কুভার

এই পার্টিতে দেরীতে হলেও এটাই ছিল আমার পক্ষে কাজ করার একমাত্র সমাধান। একটি গুচ্ছ ধন্যবাদ!
StackJP

আমি কি কোনওভাবে মিডিয়া স্টোরটি পুনরুদ্ধার করতে পারি EXT টেক্সটরা_উইউপিটিআউট onActivityResultবা সত্যিই আমার নিজের এটি মনে রাখতে হবে? আমাকে অবিরামভাবে এটি সংরক্ষণ করতে হবে যাতে কোনও ফটো তোলার সময় আমার অ্যাপ্লিকেশনটি এটি নষ্ট হয়ে গেলে এমনকি এটি মনে রাখে ...
85

এটি ললিপপের সাথে স্যামসঙ গ্যালাক্সি নোট 3 এ কাজ করে না: অ্যাভা.এল.আং.লুলপয়েন্টার এক্সসেপশন: একটি নাল বস্তুর রেফারেন্সে ভার্চুয়াল পদ্ধতি 'java.lang.String android.net.Uri.getScheme ()' আহ্বান করার চেষ্টা
ইগোর জানকোভিয়

30

আমার একই সমস্যা ছিল যেখানে ক্যামেরা অ্যাপের ঠিক আছে বোতামটি এমুলেটর এবং নেক্সাস ওয়ান উভয়ই কিছুই করতে পারেনি।

কোনও সাদা অক্ষর ছাড়াই, কোনও বিশেষ অক্ষর ছাড়াই নিরাপদ ফাইলের নাম নির্দিষ্ট করে দেওয়ার পরে সমস্যাটি সরে গেছে, MediaStore.EXTRA_OUTPUT এছাড়াও, আপনি যদি এমন কোনও ডিরেক্টরি নির্দিষ্ট করে থাকেন যা এমন একটি ডিরেক্টরিতে থাকে যা এখনও তৈরি হয়নি, আপনাকে প্রথমে এটি তৈরি করতে হবে। ক্যামেরা অ্যাপটি আপনার জন্য এমকেডির করে না।


1
এবং আপনার পাথের একাধিক ডিরেক্টরি স্তর রয়েছে এবং আপনি সেগুলি তৈরি করতে চান ( কেবল সর্বশেষটি, 'পাতা' ডিরেক্টরিটি তৈরি করে) এর mkdirs()পরিবর্তে আপনি ব্যবহার করেছেন তা নিশ্চিত করুন । এতে আমার কিছু সমস্যা হয়েছিল এবং এই উত্তরটি আমাকে সাহায্য করেছিল। mkdir()mkdir
ডায়ানা

আমরা কি সহজ টাইমস্ট্যাম্প ব্যবহার করতে পারি ?? বা এছাড়াও কিছু ত্রুটি করতে পারে ??
রিপ্লাই দিলে

@ user2247689 আপনি "সাধারণ টাইমস্ট্যাম্পস" দ্বারা তৈরি করা ফাইলটির নাম সম্পর্কে আমি নিশ্চিত নই তবে যতক্ষণ না এগুলিতে এসডি কার্ডে ফ্যাট ফর্ম্যাট দ্বারা অনুমোদিত নয় এমন অক্ষর থাকে না তবে এটি ঠিক মনে করা উচিত।
ইয়েনচি 16

28

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

private void saveFullImage() {
  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  File file = new File(Environment.getExternalStorageDirectory(), "test.jpg");
  outputFileUri = Uri.fromFile(file);
  intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
  startActivityForResult(intent, TAKE_PICTURE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if ((requestCode == TAKE_PICTURE) && (resultCode == Activity.RESULT_OK)) {
    // Check if the result includes a thumbnail Bitmap
    if (data == null) {    
      // TODO Do something with the full image stored
      // in outputFileUri. Perhaps copying it to the app folder
    }
  }
}

নোট করুন যে এটি ক্যামেরা ক্রিয়াকলাপ যা ফাইল তৈরি এবং সংরক্ষণ করবে এবং এটি আসলে আপনার অ্যাপ্লিকেশনের অংশ নয়, সুতরাং এতে আপনার অ্যাপ্লিকেশন ফোল্ডারে লেখার অনুমতি থাকবে না। আপনার অ্যাপ্লিকেশন ফোল্ডারে কোনও ফাইল সংরক্ষণ করতে, এসডি কার্ডে একটি অস্থায়ী ফাইল তৈরি করুন এবং onActivityResultহ্যান্ডলারে আপনার অ্যাপ ফোল্ডারে সরিয়ে দিন ।


এটি / করা উচিত / কাজ করে তবে ক্যামেরা অ্যাপের ঠিক আছে বোতামটি কিছুই করে না। আমরা এটি এসডি কার্ডে লেখার কাজ করে পেয়েছি, সুতরাং আমি সন্দেহ করি এটি কোনও ফাইলের অনুমতি সংক্রান্ত সমস্যা (যদিও আমি ভেবেছিলাম যে কোনও অ্যাপ্লিকেশনটির নিজস্ব ডিরেক্টরিতে স্বয়ংক্রিয়ভাবে লেখার অনুমতি রয়েছে)। সাহায্যের জন্য ধন্যবাদ!
ড্রয়

1
আপনার অ্যাপ্লিকেশনটির এটির ব্যক্তিগত ডিরেক্টরিতে লেখার অনুমতি রয়েছে - ক্যামেরা অ্যাপটি (যা ছবিটি নিচ্ছে) তা দেয় না। আপনার অ্যাপ্লিকেশনটির মধ্যে আপনি ফাইলটিকে অ্যাক্টিভিটি রেজাল্টে সরিয়ে নিতে পারেন। বিকল্পভাবে আপনি একটি ক্যামেরা ক্রিয়াকলাপটি নিজেই প্রয়োগ করতে পারেন তবে এটি ওভারকিল বলে মনে হচ্ছে।
রেটো মেয়ার

ক্যামেরা অ্যাপ্লিকেশনটি পুনরায় করা একটি সাধারণ তবে ক্লান্তিকর পদ্ধতির মতো বলে মনে হচ্ছে ... যখন আমরা getDir ("চিত্রগুলি", MODE_WORLD_WRITEABLE) ব্যবহার করি, তখন কি সেই অনুমতিটি আমরা সেই ডিরেক্টরিতে তৈরি করতে বলি এমন কোনও ফাইলের জন্য প্রযোজ্য নয়?
ড্রয়

অগত্যা। অনুমতিটি ফোল্ডারের জন্য, এর মধ্যে থাকা ফাইলগুলির জন্য অগত্যা নয়।
Meier

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

7

উপরের ইয়েনির মন্তব্যে অনুসরণ করতে, ক্যামেরা অ্যাপটি প্রশ্নযুক্ত ডিরেক্টরিতে লিখতে না পারলে ঠিক আছে বোতামটিও কিছু করবে না।

অর্থ আপনি একজন স্থান, যা শুধুমাত্র আপনার অ্যাপ্লিকেশান দ্বারা লেখার যোগ্য (উদাহরণস্বরূপ, অধীন কিছু ফাইল তৈরি করতে পারবেন না যে getCacheDir())কিছু অধীনে getExternalFilesDir()কাজ করার জন্য আছে, কিন্তু।

ক্যামেরা অ্যাপটি যদি নির্দিষ্ট EXTRA_OUTPUTপথে লিখতে না পারে তবে লগগুলিতে কোনও ত্রুটি বার্তা প্রিন্ট করা ভাল হবে ।


4

ক্যামেরাটি এসডকার্ডে লিখতে হবে তবে গ্যালারী অ্যাপটিতে একটি নতুন অ্যালবাম রাখব আমি এটি ব্যবহার করি:

 File imageDirectory = new File("/sdcard/signifio");
          String path = imageDirectory.toString().toLowerCase();
           String name = imageDirectory.getName().toLowerCase();


            ContentValues values = new ContentValues(); 
            values.put(Media.TITLE, "Image"); 
            values.put(Images.Media.BUCKET_ID, path.hashCode());
            values.put(Images.Media.BUCKET_DISPLAY_NAME,name);

            values.put(Images.Media.MIME_TYPE, "image/jpeg");
            values.put(Media.DESCRIPTION, "Image capture by camera");
           values.put("_data", "/sdcard/signifio/1111.jpg");
         uri = getContentResolver().insert( Media.EXTERNAL_CONTENT_URI , values);
            Intent i = new Intent("android.media.action.IMAGE_CAPTURE"); 

            i.putExtra(MediaStore.EXTRA_OUTPUT, uri);

            startActivityForResult(i, 0); 

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


"_ডাটা" কলামটি কোথা থেকে এসেছে? এটির জন্য কোন ধ্রুবক নেই?
ম্যাথিয়াস

3
আহ, এটি বিকাশকারী.আন্ড্রয়েড. com/references/android/provider/… আপনার কোডটিতে সত্যই ম্যাজিক স্ট্রিং ব্যবহার করা উচিত নয়।
ম্যাথিয়াস

1

আমার একই সমস্যা ছিল এবং আমি এটি নিম্নলিখিত দ্বারা স্থির করেছি:

সমস্যাটি হ'ল যখন আপনি এমন কোনও ফাইল নির্দিষ্ট করেন যা কেবলমাত্র আপনার অ্যাপের অ্যাক্সেস থাকে (যেমন কল করে getFileStreamPath("file");)

এজন্য আমি কেবলমাত্র নিশ্চিত হয়েছি যে প্রদত্ত ফাইলটি সত্যই উপস্থিত রয়েছে এবং প্রত্যেকেরই এতে লিখিত অ্যাক্সেস রয়েছে।

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File outFile = getFileStreamPath(Config.IMAGE_FILENAME);
outFile.createNewFile();
outFile.setWritable(true, false);
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,Uri.fromFile(outFile));
startActivityForResult(intent, 2);

এইভাবে, ক্যামেরা অ্যাপ্লিকেশনটিতে প্রদত্ত উরিতে লেখার অ্যাক্সেস রয়েছে এবং ঠিক আছে বোতামটি ঠিক কাজ করে :)


অ্যান্ড্রয়েডআরটাইম (২.১ এমুলেটর) নোছমথোডেরর নিক্ষেপ করেছে: java.io.File.setWritable
জাওয়াদস্যাক

1

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


0

আমি একটি সাধারণ লাইব্রেরি তৈরি করেছি যা বিভিন্ন উত্স (গ্যালারী, ক্যামেরা) থেকে চিত্রগুলি বেছে নেওয়ার ব্যবস্থা করবে, সম্ভবত এটি কোনও কোনও স্থানে (এসডি-কার্ড বা অভ্যন্তরীণ মেমরি) সংরক্ষণ করুন এবং চিত্রটি ফিরিয়ে দিন যাতে অনুগ্রহ করে এটি ব্যবহার করুন এবং এটি উন্নত করুন - অ্যান্ড্রয়েড-ইমেজচুসার


আপনার লিঙ্কটি আর কাজ করছে না !! কেন, আমি এটি 2 সপ্তাহ আগে দেখেছি এবং আমি এটি ব্যবহার করতে চেয়েছিলাম :(
মোহাম্মদ এরশান

0

ফাইলটি ক্যামেরা দ্বারা রাইটিংযোগ্য হওয়া দরকার, যেমনটি প্রবীণ উল্লেখ করেছিলেন।

আমার ব্যবহারে আমি ফাইলটি অভ্যন্তরীণ স্টোরেজে সঞ্চয় করতে চেয়েছিলাম। আমি এটি দিয়ে:

Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (i.resolveActivity(getPackageManager()!=null)){
    try{
        cacheFile = createTempFile("img",".jpg",getCacheDir());
        cacheFile.setWritavle(true,false);
    }catch(IOException e){}
    if(cacheFile != null){
        i.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(cacheFile));
        startActivityForResult(i,REQUEST_IMAGE_CAPTURE);
    }
}

এখানে cacheFileএকটি গ্লোবাল ফাইল রয়েছে যা ফাইলটি উল্লেখ করা হয়। তারপরে ফলাফল পদ্ধতিতে প্রত্যাবর্তিত অভিপ্রায়টি নাল। তারপরে উদ্দেশ্যটি প্রক্রিয়াকরণের পদ্ধতিটি দেখতে এমন দেখাচ্ছে:

protected void onActivityResult(int requestCode,int resultCode,Intent data){
    if(requestCode != RESULT_OK){
        return;
    }
    if(requestCode == REQUEST_IMAGE_CAPTURE){
        try{
            File output = getImageFile();
            if(output != null && cacheFile != null){
                copyFile(cacheFile,output);

                //Process image file stored at output

                cacheFile.delete();
                cacheFile=null;
            }
        }catch(IOException e){}
    }
}

getImageFile()ফাইলটি নামকরণ এবং তৈরি করার জন্য এখানে একটি ইউটিলিটি পদ্ধতি রয়েছে যাতে ছবিটি সংরক্ষণ করা উচিত এবং copyFile()ফাইলটি অনুলিপি করার একটি পদ্ধতি।


0

আপনি এই কোড ব্যবহার করতে পারেন

private Intent getCameraIntent() {

    PackageManager packageManager = mContext.getPackageManager();
    List<ApplicationInfo> list = packageManager.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
    Intent main = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    List<ResolveInfo> launchables = packageManager.queryIntentActivities(main, 0);
    if (launchables.size() == 1)
        return packageManager.getLaunchIntentForPackage(launchables.get(0).activityInfo.packageName);
    else
        for (int n = 0; n < list.size(); n++) {
            if ((list.get(n).flags & ApplicationInfo.FLAG_SYSTEM) == 1) {
                Log.d("TAG", "Installed Applications  : " + list.get(n).loadLabel(packageManager).toString());
                Log.d("TAG", "package name  : " + list.get(n).packageName);
                String defaultCameraPackage = list.get(n).packageName;


                if (launchables.size() > 1)
                    for (int i = 0; i < launchables.size(); i++) {
                        if (defaultCameraPackage.equals(launchables.get(i).activityInfo.packageName)) {
                            return packageManager.getLaunchIntentForPackage(defaultCameraPackage);
                        }
                    }
            }
        }
    return null;
}

0

ক্রিয়াকলাপের ফলাফল কোড সহ এই সমস্যাটি সমাধান করা খুব সহজ is

if (reqCode == RECORD_VIDEO) {
   if(resCode == RESULT_OK) {
       if (uri != null) {
           compress();
       }
    } else if(resCode == RESULT_CANCELED && data!=null){
       Toast.makeText(MainActivity.this,"No Video Recorded",Toast.LENGTH_SHORT).show();
   }
}

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

0
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_CANCELED)
    {
        //do not process data, I use return; to resume activity calling camera intent
        enter code here
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.