سؤال

لدي بعض الصور المخزنة في getExternalFilesDir() وأحاول عرض تلك الصور في معرض Android (cooliris).الآن كنت أفعل هذا:

Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(imgPath,"image/*");
startActivity(intent);

ولكن لا شيء يحدث.لقد قمت بتغيير setDataAndType إلى هذا:

intent.setDataAndType(Uri.fromFile(new File(imgPath)),"image/*");

تعمل هذه الطريقة، ولكن الأمر يستغرق من 5 إلى 10 ثوانٍ حتى ينتقل المعرض من شاشة سوداء إلى عرض صورتي.

على أي حال لحل هذا أو أي نهج أفضل؟

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

المحلول

ومن خلال تطبيق موفر محتوى الملف، ستتمكن من تجنب هذا التأخير الذي يتراوح بين 5 و10 ثوانٍ

import java.io.File;
import java.io.FileNotFoundException;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.ParcelFileDescriptor;

public class FileContentProvider extends ContentProvider {
    private static final String AUTHORITY = "content://com.yourprojectinfo.fileprovider";

    public static Uri constructUri(String url) {
        Uri uri = Uri.parse(url);
        return uri.isAbsolute() ? uri : Uri.parse(AUTHORITY + url);
    }

    public static Uri constructUri(File file) {
        Uri uri = Uri.parse(file.getAbsolutePath());
        return uri.isAbsolute() ? uri : Uri.parse(AUTHORITY
                + file.getAbsolutePath());
    }

    @Override
    public ParcelFileDescriptor openFile(Uri uri, String mode)
            throws FileNotFoundException {
        File file = new File(uri.getPath());
        ParcelFileDescriptor parcel = ParcelFileDescriptor.open(file,
                ParcelFileDescriptor.MODE_READ_ONLY);
        return parcel;
    }

    @Override
    public boolean onCreate() {
        return true;
    }

    @Override
    public int delete(Uri uri, String s, String[] as) {
        throw new UnsupportedOperationException(
                "Not supported by this provider");
    }

    @Override
    public String getType(Uri uri) {
        return "image/jpeg";
    }

    @Override
    public Uri insert(Uri uri, ContentValues contentvalues) {
        throw new UnsupportedOperationException(
                "Not supported by this provider");
    }

    @Override
    public Cursor query(Uri uri, String[] as, String s, String[] as1, String s1) {
        throw new UnsupportedOperationException(
                "Not supported by this provider");
    }

    @Override
    public int update(Uri uri, ContentValues contentvalues, String s,
            String[] as) {
        throw new UnsupportedOperationException(
                "Not supported by this provider");
    }

}

ثم يمكنك الاتصال

Uri uri = FileContentProvider.constructUri(file);
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(uri,"image/*");
startActivity(intent);

يعد هذا حلاً غريبًا ولكن أعتقد أن له علاقة بكيفية فتح Android للصور باستخدام URI.طريقة openFile (Uri uri، String mode) الخاصة بهم خاطئة/معطلة/لا يمكنها حل URI بشكل صحيح.لست متأكدًا بنسبة 100٪ ولكنني وجدت أن هذا الحل البديل فعال.

لا تنس التسجيل لدى المزود في البيان

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top