سؤال

أنا أستخدم التعليمات البرمجية التالية لفتح معرض داخل تطبيقي

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, FIND_RESULT);

هل من الممكن الحد من قائمة الصور لإظهار الصور التي التقطتها الكاميرا فقط؟ عرض معرض على نظام 2.1 ، يتم تجميع الصور لذلك يجب أن تكون هناك معلمة تحدد المجلد الذي ينتمي إليه.

فحص mediaStore.Images.ImageColumns لم أجد أي عمود يحدد مثل هذا الشيء.

هل يمكن أن أكون مخطئا؟ لأنه إذا تمكنت من إنشاء استعلام لتصفية المجلد وإنشاء عرض المعرض الخاص بي ، فسيتم حل مشكلتي.

هل كانت مفيدة؟

المحلول

تحتاج فقط إلى تنفيذ MediaScannerConnectionClient في نشاطك وبعد ذلك يجب عليك إعطاء المسار الدقيق لواحد من الملف الموجود هذا المجلد هنا كـ Scan_Path وسيقوم بمسح جميع الملفات التي تحتوي في هذا المجلد وفتحه داخل المعرض المضمّن. لذا ، فقط أعط اسم المجلد الخاص بك وستحصل على جميع الملفات في الداخل بما في ذلك الفيديو. إذا كنت تريد فتح الصور فقط FILE_TYPE="image/*"

public class SlideShow extends Activity implements MediaScannerConnectionClient {

        public String[] allFiles;
        private String SCAN_PATH ;
        private static final String FILE_TYPE = "*/*";
        private MediaScannerConnection conn;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);

            setContentView(R.layout.main);

            File folder = new File("/sdcard/yourfoldername/");
            allFiles = folder.list();

            SCAN_PATH=Environment.getExternalStorageDirectory().toString()+"/yourfoldername/"+allFiles[0];

            Button scanBtn = (Button) findViewById(R.id.scanBtn);
            scanBtn.setOnClickListener(new OnClickListener()
            {
                public void onClick(View v)
                {
                    startScan();
                }
            });
        }

        private void startScan()
        {
            if(conn!=null)
            {
                conn.disconnect();
            }

            conn = new MediaScannerConnection(this, this);
            conn.connect();
        }


        public void onMediaScannerConnected()
        {
            conn.scanFile(SCAN_PATH, FILE_TYPE);    
        }


        public void onScanCompleted(String path, Uri uri)
        {
            try
            {
                if (uri != null) 
                {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setData(uri);
                    startActivity(intent);
                }
            }
            finally 
            {
                conn.disconnect();
                conn = null;
            }
        }
    }

نصائح أخرى

لا توجد أي من الإجابات أعلاه صحيحة ، بما في ذلك الإجابات التي تم وضع علامة عليها على أنها صحيحة.

هذا هو الحل الصحيح الفعلي:

السر هو العثور على دلو/الألبوم الذي تم تمثيل المجلد الخاص بك على أنه. تظهر الجرافات بعد MediaScan الناجحة ، لذا تأكد من مسح أي صور/مقاطع فيديو تريد عرضها أولاً كما هو موضح عدة مرات أعلاه.

لنفترض أن لدي مجلد مفهرس في/sdcard/myapp/myappsmediafolder:

String bucketId = "";

final String[] projection = new String[] {"DISTINCT " + MediaStore.Images.Media.BUCKET_DISPLAY_NAME + ", " + MediaStore.Images.Media.BUCKET_ID};
final Cursor cur = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, null);

while (cur != null && cur.moveToNext()) {
    final String bucketName = cur.getString((cur.getColumnIndex(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME)));
    if (bucketName.equals("myappsmediafolder")) {
        bucketId = cur.getString((cur.getColumnIndex(MediaStore.Images.ImageColumns.BUCKET_ID)));
        break;
    }
}

الآن بعد أن أصبح لدينا الجرداء لألبومنا ، يمكننا فتحه بقصد بسيط.

مرشحات ملفات الفيديو:

Uri mediaUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;

مرشحات ملفات الصور:

Uri mediaUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

...

if (bucketId.length() > 0) {
    mediaUri = mediaUri.buildUpon()
            .authority("media")
            .appendQueryParameter("bucketId", bucketId)
            .build();
}

Intent intent = new Intent(Intent.ACTION_VIEW, mediaUri);
startActivity(intent);

يمكنني التحقق من هذا العمل مع تطبيق المعرض المدمج. قد تختلف الأميال مع تطبيقات أخرى مثل صور Google.

لا يزال يتعين عليّ معرفة كيفية عدم تصفية الصور/الفيديو ، على الرغم من أنه يمكنك تحديد ألبوم معين بدون مرشح.

لقد اكتشفت هذا من خلال النظر إلى مصدر AOSP لتطبيق المعرض.

ليس لدي سمعة كافية لتصويت أو التعليق على إجابته ، لكن إجابة شلدودي تتيح لك وضع دليل يوري في نية المعرض. لذلك عند فتح تطبيق المعرض ، يعرض جميع الصور بدلاً من 1.

بالنسبة لي ، لم ينجح مسح ملفاتي مثل الإجابات أعلاه. الاستعلام عن mediastore.images.media.external_content_uri عملت فقط بعد إدخال صفوف جديدة في جدول mediastore.images.media.data مع contentResolver:

ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, image.getPath());  
values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpeg");
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

هنا واحد مبسط

private  MediaScannerConnection conn;
private void notifySystemWithImage(final File imageFile) {

        conn = new MediaScannerConnection(this, new MediaScannerConnectionClient() {

        @Override
        public void onScanCompleted(String path, Uri uri) {

            try {
                if (uri != null) {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setDataAndType(uri, "image/*");
                    startActivity(intent);
                }
            } finally {
                conn.disconnect();
                conn = null;
            }
        }

        @Override
        public void onMediaScannerConnected() {
            conn.scanFile(imageFile.getAbsolutePath(), "*/*"); 

        }
    });

        conn.connect();
}

بالنسبة لأولئك الذين ما زال هذا يعطي النشاط لم يتم العثور على استثناء:

تحتاج إلى تحديد دليل مجلد التطبيق الداخلي. ليس جذر المستخدم الافتراضي إذا كانت الصور وكل شيء.

public class SlideShow extends Activity implements MediaScannerConnectionClient {

        public String[] allFiles;
        private String SCAN_PATH ;
        private static final String FILE_TYPE = "*/*";
        private MediaScannerConnection conn;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);

            setContentView(R.layout.main);

            File folder = new File(HistoryActivity.this.getExternalFilesDir(null)+"/a/");
            allFiles = folder.list();

            SCAN_PATH= HistoryActivity.this.getExternalFilesDir(null)+"/a/"+allFiles[0];

            Button scanBtn = (Button) findViewById(R.id.scanBtn);
            scanBtn.setOnClickListener(new OnClickListener()
            {
                public void onClick(View v)
                {
                    startScan();
                }
            });
        }

        private void startScan()
        {
            if(conn!=null)
            {
                conn.disconnect();
            }

            conn = new MediaScannerConnection(this, this);
            conn.connect();
        }


        public void onMediaScannerConnected()
        {
            conn.scanFile(SCAN_PATH, FILE_TYPE);    
        }


        public void onScanCompleted(String path, Uri uri)
        {
            try
            {
                if (uri != null) 
                {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setData(uri);
                    startActivity(intent);
                }
            }
            finally 
            {
                conn.disconnect();
                conn = null;
            }
        }
    }

يعمل ... لكن Kitkat تظهر صورة واحدة فقط. تمكنت من إصلاحه للإصدارات السابقة مع (تحديث المعرض ، عند تخزين الصورة):

public void savePhoto(Bitmap bmp)
{
    File imageFileFolder = new File(context.getExternalFilesDir(null)+"/a/") ;
    imageFileFolder.mkdir();
    FileOutputStream out = null;
    Calendar c = Calendar.getInstance();
    String date = fromInt(c.get(Calendar.MONTH))
            + fromInt(c.get(Calendar.DAY_OF_MONTH))
            + fromInt(c.get(Calendar.YEAR))
            + fromInt(c.get(Calendar.HOUR_OF_DAY))
            + fromInt(c.get(Calendar.MINUTE))
            + fromInt(c.get(Calendar.SECOND));
    File imageFileName = new File(imageFileFolder, date.toString() + ".jpg");
    try
    {
        out = new FileOutputStream(imageFileName);
        bmp.compress(Bitmap.CompressFormat.JPEG, 100, out);
        out.flush();
        out.close();
        scanPhoto(imageFileName.toString());
        out = null;
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}


public String fromInt(int val)
{
    return String.valueOf(val);
}


public void scanPhoto(final String imageFileName)
{
    msConn = new MediaScannerConnection(context,new MediaScannerConnection.MediaScannerConnectionClient()
    {
        public void onMediaScannerConnected()
        {
            msConn.scanFile(imageFileName, null);
            Log.i("msClient obj  in Photo Utility", "connection established");
        }
        public void onScanCompleted(String path, Uri uri)
        {
            msConn.disconnect();
            Log.i("msClient obj in Photo Utility","scan completed");
        }
    });
    msConn.connect();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top