চিত্র, এসডকার্ডে সংরক্ষিত, অ্যান্ড্রয়েডের গ্যালারী অ্যাপে উপস্থিত হয় না


93

আমি একটি চিত্র এসডকার্ডে সংরক্ষণ করি এবং এসডিকার্ডটি সরিয়ে না ফেরা পর্যন্ত গ্যালারী অ্যাপ্লিকেশনটিতে উপস্থিত হয় না।

এটা কেন এমন আপনার কোনও ধারণা আছে?

দেখে মনে হচ্ছে গ্যালারী অ্যাপ্লিকেশনটিতে কিছু ক্যাশে রয়েছে যা ফাইল সংরক্ষণে আপডেট হয় না ...

বাস্তবিক, আমি গ্যালারি অ্যাপ্লিকেশনে শুধু সংরক্ষিত ইমেজ খুলুন এবং সঙ্গে কোনো সাফল্য চাই
এই এই সমস্যা সম্পর্কে আমার প্রশ্ন।


4
এই প্রশ্ন টিউটোরিয়ালে ধাপে ধাপে উত্তর দেওয়া হয়েছে stackoverflow.com/questions/30506301/...
Takermania

উত্তর:


45

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

http://developer.android.com/references/android/media/MediaScannerConnication.html


4
পার্শ্ব দ্রষ্টব্য: যদিও প্রশ্নটি ফাইল সংযোজনকে বোঝায়, মিডিয়াস্ক্যানার সংযোগ ফাইল মোছার জন্য কোনও সমাধান সরবরাহ করে না - এমনকি মুছে ফেলা ফাইলের মূল ফোল্ডারটি স্ক্যান করার জন্য অনুরোধ না করেও নয়।
অ্যালিক্লিজিন-কিলাকা

86

একটি সহজ সমাধান স্থিতিশীল সুবিধা পদ্ধতি স্ক্যান ফাইল () ব্যবহার করা হয় :

File imageFile = ...
MediaScannerConnection.scanFile(this, new String[] { imageFile.getPath() }, new String[] { "image/jpeg" }, null);

যেখানে thisআপনার কার্যকলাপের (অথবা যাই হোক না কেন প্রসঙ্গ) হয়, মাইম-টাইপ শুধুমাত্র প্রয়োজনীয় যদি আপনি অ-মানক ফাইল এক্সটেনশন ব্যবহার করেন এবং nullঐচ্ছিক কলব্যাক জন্য (যা আমরা যেমন একটি সহজ ক্ষেত্রে জন্য প্রয়োজন হবে না)।


4
স্পট অন, অন্যরা (এবং গুগল) যে সম্প্রচারের পদ্ধতি সরবরাহ করে, খুব কমই কাজ করে)।
ক্রিস। জেনকিন্স

4
এটি আমার জন্য পূর্ববর্তী অ্যান্ড্রয়েড সংস্করণ ~ 4.0 এ কাজ করেছিল তবে এখন 4.3+ এ কাজ করছে বলে মনে হয় না। চিত্রগুলি গ্যালারী অ্যাপটিতে প্রদর্শিত হচ্ছে না।
hooby3dfx

পারফেক্ট! আপনি এর সাথে প্রসঙ্গটি পেতে পারেন: Android.App.Application.Context
jug

মার্শমেলোতে কাজ করেছেন
হিতেশ সাহু

66

মূল প্রশ্নের আমার উত্তর এবং অন্য কারও কাছেও এই সমস্যা থাকতে পারে:

আমার একই সমস্যা হচ্ছিল, আমার অ্যাপে থাকা চিত্রগুলি যা লোকেরা এসডি কার্ডে সংরক্ষণ করেছে তাৎক্ষণিকভাবে তাদের গ্যালারীটিতে প্রদর্শিত হচ্ছে না। কিছু অনুসন্ধানের পরে আমি খুঁজে পেলাম এই একটি লাইন কোড afterোকানো পরে আমার 'এসডি কার্ডে সংরক্ষণ করুন' কোডটি যা সমস্যার সমাধান করেছে:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

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

4
এটি পুরানো তবে এটি কাউকে সাহায্য করতে পারে - একটি আরও সুনির্দিষ্ট পাথ: সেন্ডব্রোডকাস্ট (নতুন ইন্টেন্ট (অভিসন্ধি। এই পদ্ধতিটি (এই উত্তরটি, কেবল আমার মন্তব্য নয়) এমুলেটরটিতে কাজ করে না। আসল ডিভাইসে পরীক্ষা করুন।

আমি বিশ্বাস করি গৃহীত উত্তরগুলি এটি করার সঠিক উপায় সরবরাহ করে। তবে আপনি যদি API <= 7 কে সমর্থন করার চেষ্টা করছেন তবে এটি একটি দুর্দান্ত ফলব্যাক।
আমর মোস্তফা

আপনার উত্তর অন্যান্য ডিভাইসের জন্য সহায়ক। যখন আমি আমার অ্যাপ্লিকেশন ফোল্ডারটি স্ক্যান করার চেষ্টা করি তখন এটি এইচটিসি তে কাজ করে না। এটি নতুন যুক্ত হওয়া চিত্র দেখায় না।
MobileEvangelist

6
এটি আর অ্যান্ড্রয়েড ৪.৪ বা ততোধিক আকারে সমর্থিত বলে মনে হচ্ছে না। এক্ষেত্রে অনুমতি ব্যতিক্রম ছুঁড়ে দেওয়া হবে।
আরএসপি 1984

13

আপনি ইচ্ছাকৃতভাবে মিডিয়া গ্যালারীটিতে একটি চিত্র যুক্ত করতে পারেন, উদাহরণটি কোডটি দেখুন এটি কীভাবে হয় তা দেখুন:

ContentValues image = new ContentValues();

image.put(Images.Media.TITLE, imageTitle);
image.put(Images.Media.DISPLAY_NAME, imageDisplayName);
image.put(Images.Media.DESCRIPTION, imageDescription);
image.put(Images.Media.DATE_ADDED, dateTaken);
image.put(Images.Media.DATE_TAKEN, dateTaken);
image.put(Images.Media.DATE_MODIFIED, dateTaken);
image.put(Images.Media.MIME_TYPE, "image/png");
image.put(Images.Media.ORIENTATION, 0);

 File parent = imageFile.getParentFile();
 String path = parent.toString().toLowerCase();
 String name = parent.getName().toLowerCase();
 image.put(Images.ImageColumns.BUCKET_ID, path.hashCode());
 image.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, name);
 image.put(Images.Media.SIZE, imageFile.length());

 image.put(Images.Media.DATA, imageFile.getAbsolutePath());

 Uri result = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, image);

ওহে. এই পদ্ধতিটি মিডিয়াস্টোরটিতে চিত্রটি যুক্ত করে, আমি ফিরে এসে দেখেছি এটি নিশ্চিত করেছি Uriতবে সমস্যাটি sertedোকানো চিত্রটি গ্যালারীটিতে প্রদর্শিত হচ্ছে না। আমি শুরুতে এবং গ্যালারীটির শেষে উভয়ই পরীক্ষা করে দেখেছি। Pleaseোকানো চিত্রটি গ্যালারীটিতে তত্ক্ষণাত প্রদর্শিত হওয়া উচিত দয়া করে কোনও পদ্ধতির পরামর্শ দিতে পারেন?
শজিল আফজাল

12

অ্যান্ড্রয়েড কিটকেট সহ গ্যালারী রিফ্রেশ

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
{
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        File f = new File("file://"+ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);
        this.sendBroadcast(mediaScanIntent);
}
else
{
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}

"আইএফ" বিবৃতিটি প্রথম শর্তের ভিতরে থাকা কোডটি কিটকেটে আমার জন্য দুর্দান্ত কাজ করে (অ্যান্ড্রয়েড ৪.৪.৪, এপিআই ১৯)।
অ্যালেক্স

8

মিডিয়াস্ক্যানার সংযোগের জন্য কোডটি এখানে:

MyMediaConnectorClient client = new MyMediaConnectorClient(newfile);
MediaScannerConnection scanner = new MediaScannerConnection(context, client);
client.setScanner(scanner);
scanner.connect();

newfile আপনার নতুন / সংরক্ষিত ফাইলের ফাইল অবজেক্ট।


4
আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ। আসলে, আমি ইতিমধ্যে এই প্রকল্পটি অনেক আগেই শেষ করেছি ... আমি এমনকি মনে করি না যে আমি যে সমাধানটি ব্যবহার করেছি তা কী ছিল। আপনি যদি এর বাস্তবায়নও সরবরাহ করতে চান তবে অন্য ব্যবহারকারীরা আপনার সমাধানটিকে সহায়ক বলে মনে করতে পারেন MyMediaConnectorClient...
মাইকেল কেসেলার

হ্যাঁ - এই মুহুর্তে আমার এ নিয়ে আসল মাথা ব্যথা হচ্ছে। দয়া করে পোস্ট করুন :)
স্টিভ

হ্যাঁ আমি প্রবাহটি কীভাবে হওয়া উচিত সে সম্পর্কে সত্যই আমি স্পষ্ট নই - আমার যেখানে ভুল আমি সংশোধন করব আমি SDCARD তথ্য আপডেট করতে মিডিয়াস্ক্যানার সংযোগ ব্যবহার করতে পারি যাতে আমি ক্যামেরা সহ ছবি তুলি এবং নতুন ফাইলটি এমএসসিতে পাস করি এবং এখন আমি ফাইলটি অ্যাক্সেস করতে পারি একটি সংযোগ স্ক্যানার ক্লায়েন্ট সঙ্গে?
স্টিভ

প্রবাহটি হ'ল: আপনি একটি ছবি তুলুন, এটি আপনার এসডকার্ডে সংরক্ষণ করুন এবং তারপরে স্ক্যানার আপডেট করুন, যাতে ডিভাইস গ্যালারিতে আপনার সংরক্ষিত ছবিটি দেখতে ফাইল সিস্টেমটি আপডেট হয়। আপনি যদি স্ক্যানারের সাহায্যে এটি না করেন, আপনি পরের ডিভাইসটি গ্যালারীটিতে পুনঃসূচনা করার পরে আপনার ছবিটি দেখতে পাবেন।
ডিএমজি

7

এমুলেটরটিতে একটি অ্যাপ রয়েছে যা বলছে - 'দেব সরঞ্জাম'

এটিতে ক্লিক করুন এবং 'মিডিয়া স্ক্যানিং' নির্বাচন করুন .. সমস্ত চিত্র স্ক্যান হয়ে যাবে


জেনে দুর্দান্ত, আপনি যা বলার আগে আমি জানতাম তার একমাত্র উপায় যে ফোনটি রিবুট করা :)
মিশকিন

6

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

private void startScan() 
{ 
    if(conn!=null) conn.disconnect();  
    conn = new MediaScannerConnection(YourActivity.this,YourActivity.this); 
    conn.connect(); 
} 

@Override 
public void onMediaScannerConnected() { 
    try{
        conn.scanFile(yourImagePath, "image/*");
       } catch (java.lang.IllegalStateException e){
       }
}

@Override 
public void onScanCompleted(String path, Uri uri) { 
    conn.disconnect(); 
} 

ওহে! আমরা যদি Uriচিত্রটিরটি জানি তবে কী হবে , উদাহরণস্বরূপ:content://media/external/images/media/1231778
শজিল আফজাল


4
 File folderGIF = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/newgif2");    //path where gif will be stored
success = folderGIF.mkdir();    //make directory
 String finalPath = folderGIF + "/test1.gif";  //path of file
.....
/* changes in gallery app if any changes in done*/
 MediaScannerConnection.scanFile(this,
                    new String[]{finalPath}, null,
                    new MediaScannerConnection.OnScanCompletedListener() {
                        public void onScanCompleted(String path, Uri uri) {
                            Log.i("ExternalStorage", "Scanned " + path + ":");
                            Log.i("ExternalStorage", "-> uri=" + uri);
                        }
                    });

আমি অ্যানিমেটেড জিআইএফ ফাইলটি সংরক্ষণ করতে চাই যা বাহ্যিক স্টোরেজে অবস্থিত এবং আমি পাথ অর্থাৎ / স্টোরেজ / এমুলেটেড / 0 / অ্যান্ড্রয়েড / ডেটা / <প্যাকেজনাম / ফাইল / <ফোল্ডারনাম> / আক্সিজিএফ। এখন আমি এই ফাইলটি ইমেজ গ্যালারিতে সংরক্ষণ / অনুলিপি করতে এবং সেখানে প্রদর্শন করতে চাই। এই কিভাবে করবেন.
জিয়া উর রহমান

3

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

  1. প্রথমে চিত্র বিটম্যাপ ডাউনলোড করুন



     private Bitmap loadBitmap(String url) {
        try {
            InputStream in = new java.net.URL(url).openStream();
            return BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
       }


  1. আপনার অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল ফাইলে নিম্নলিখিত অনুমতিও সরবরাহ করুন।


    uses-permission android:name="android.permission.INTERNET" 
    uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"


  1. এখানে অ্যাক্টিটিতে লিখিত পুরো কোডটি এখানে আমরা এই কাজটি সম্পাদন করতে চাই।



     void saveMyImage(String appName, String imageUrl, String imageName) {

            Bitmap bmImg = loadBitmap(imageUrl);
            File filename;
            try {
                String path1 = android.os.Environment.getExternalStorageDirectory()
                        .toString();
                File file = new File(path1 + "/" + appName);
                if (!file.exists())
                    file.mkdirs();
                filename = new File(file.getAbsolutePath() + "/" + imageName
                        + ".jpg");
                FileOutputStream out = new FileOutputStream(filename);
                bmImg.compress(Bitmap.CompressFormat.JPEG, 90, out);
                out.flush();
                out.close();
                ContentValues image = new ContentValues();
                image.put(Images.Media.TITLE, appName);
                image.put(Images.Media.DISPLAY_NAME, imageName);
                image.put(Images.Media.DESCRIPTION, "App Image");
                image.put(Images.Media.DATE_ADDED, System.currentTimeMillis());
                image.put(Images.Media.MIME_TYPE, "image/jpg");
                image.put(Images.Media.ORIENTATION, 0);
                File parent = filename.getParentFile();
                image.put(Images.ImageColumns.BUCKET_ID, parent.toString()
                        .toLowerCase().hashCode());
                image.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, parent.getName()
                        .toLowerCase());
                image.put(Images.Media.SIZE, filename.length());
                image.put(Images.Media.DATA, filename.getAbsolutePath());
                Uri result = getContentResolver().insert(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, image);
                Toast.makeText(getApplicationContext(),
                        "File is Saved in  " + filename, Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }


  1. আশা করি এটি আপনার পুরো সমস্যার সমাধান করতে পারে।

3
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

KITKAT তে কাজ করছে বলে মনে হচ্ছে না। এটি অনুমতি অস্বীকার ব্যতিক্রম ছোঁড়ে এবং অ্যাপটিকে ক্র্যাশ করে। সুতরাং এর জন্য, আমি নিম্নলিখিতগুলি করেছি,

String path = mediaStorageDir.getPath() + File.separator
                    + "IMG_Some_name.jpg";
CameraActivity.this.sendBroadcast(new Intent(
                             Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri
                            .parse("file://" + path)));

আশা করি এটা সাহায্য করবে.


2

ছবিটি সংরক্ষণ করার পরে এটি ব্যবহার করুন

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

4
এটি কাজ করে তবে এটি সেরা সমাধান নয়। আপনি এসডি কার্ডটি (পুনরায়) মাউন্ট করা হবে এবং সম্ভবত পুরো এসডি কার্ডটি পুনরুদ্ধার করতে বাধ্য করবে এই ভেবে সিস্টেমটিকে ট্রিক করছেন। আপনি এখন যে ফাইলটি যুক্ত করতে চান সেই সময় মিডিয়াস্ক্যানার.স্কানফায়াল (..) হ'ল সেরা সমাধান।
পকমো

4
সমস্ত চিত্রের জন্য এই অনুসন্ধান। এবং এতে প্রচুর অপ্রয়োজনীয় ডেটা প্রসেসিং জড়িত যা আমাদের কাছে কেবলমাত্র একক চিত্র গ্যালারিতে দেখানোর জন্য অপ্রাসঙ্গিক হতে পারে।
রাহুল রাস্তোগি

2

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

public class MyMediaConnectorClient implements MediaScannerConnectionClient {

    String _fisier;
    MediaScannerConnection MEDIA_SCANNER_CONNECTION;

    public MyMediaConnectorClient(String nume) {
        _fisier = nume;
    }

    public void setScanner(MediaScannerConnection msc){
        MEDIA_SCANNER_CONNECTION = msc;
    }

    @Override
    public void onMediaScannerConnected() {
        MEDIA_SCANNER_CONNECTION.scanFile(_fisier, null);
    }

    @Override
    public void onScanCompleted(String path, Uri uri) {
        if(path.equals(_fisier))
            MEDIA_SCANNER_CONNECTION.disconnect();
    }
}

0

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


0

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

      String resultPath = getExternalFilesDir(Environment.DIRECTORY_PICTURES)+ 
      getString(R.string.directory) + System.currentTimeMillis() + ".jpg";

       new File(resultPath).getParentFile().mkdir();

        try {
            OutputStream fileOutputStream = new FileOutputStream(resultPath);
            savedBitmap.compress(CompressFormat.JPEG, 100, fileOutputStream);
            fileOutputStream.flush();
            fileOutputStream.close();
        } catch (IOException e2) {
            e2.printStackTrace();
        }
        savedBitmap.recycle();

        File file = new File(resultPath);
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.TITLE, "Photo");
        values.put(MediaStore.Images.Media.DESCRIPTION, "Edited");
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
        values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis ());
        values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis());
        values.put(MediaStore.Images.ImageColumns.BUCKET_ID, file.toString().toLowerCase(Locale.US).hashCode());
        values.put(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, file.getName().toLowerCase(Locale.US));
        values.put("_data", resultPath);

        ContentResolver cr = getContentResolver();
        cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);




        return  resultPath;

0

এটি ব্যবহার করে দেখুন, এটি তৈরি হওয়া একটি নতুন চিত্র সম্পর্কে সম্প্রচারিত হবে, যাতে আপনার চিত্রটি দৃশ্যমান। একটি গ্যালারী ভিতরে। ফটোফিল নতুন নির্মিত চিত্রের প্রকৃত ফাইল পাথের সাথে প্রতিস্থাপন করুন

private void galleryAddPicBroadCast() {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        Uri contentUri = Uri.fromFile(photoFile);
        mediaScanIntent.setData(contentUri);
        this.sendBroadcast(mediaScanIntent);
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.