studio افتح صورة باستخدام URI في عارض الصور الافتراضي لمعرض Android




textview android (10)

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

حصلت على حل من مزيج من إجابات SO المختلفة ..

Intent galleryIntent = new Intent(Intent.ACTION_VIEW, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
galleryIntent.setDataAndType(Uri.fromFile(mImsgeFileName), "image/*");
galleryIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(galleryIntent);

هذا واحد فقط عملت بالنسبة لي ..

لقد استخرجت uri للصور ، والآن أود أن افتح الصورة باستخدام عارض الصور الافتراضي في Android. أو حتى أفضل ، يمكن للمستخدم اختيار برنامج لاستخدامه لفتح الصورة. هناك شيء مثل مستكشف الملفات يعرض عليك إذا حاولت فتح ملف.


إذا كان تطبيقك يستهدف Android N (7.0) والإصدارات الأحدث ، يجب ألا تستخدم الإجابات المذكورة أعلاه (من طريقة "Uri.fromFile") ، لأنها لن تعمل من أجلك.

بدلا من ذلك ، يجب عليك استخدام ContentProvider.

على سبيل المثال ، إذا كان ملف الصورة موجودًا في مجلد خارجي ، فيمكنك استخدام هذا (على غرار الشفرة التي قمت بها here ):

File file = ...;
final Intent intent = new Intent(Intent.ACTION_VIEW)//
                                    .setDataAndType(VERSION.SDK_INT >= VERSION_CODES.N ?
                                                    android.support.v4.content.FileProvider.getUriForFile(this,getPackageName() + ".provider", file) : Uri.fromFile(file),
                            "image/*").addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

قائمة:

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"/>
</provider>

res / xml / provider_paths.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <!--<external-path name="external_files" path="."/>-->
    <external-path
        name="files_root"
        path="Android/data/${applicationId}"/>
    <external-path
        name="external_storage_root"
        path="."/>
</paths>

إذا كانت صورتك في المسار الخاص للتطبيق ، فيجب إنشاء ContentProvider الخاص بك ، حيث أنشأت "OpenFileProvider" على الرابط.


استنادا إلى الإجابة فيكاس ولكن مع تعديل طفيف: يتم استلام أوري بواسطة المعلمة:

private void showPhoto(Uri photoUri){
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setDataAndType(photoUri, "image/*");
    startActivity(intent);
}

اسأل نفسي ، أجب عن نفسي أيضا:

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("content://media/external/images/media/16"))); /** replace with your own uri */

وسوف يسأل أيضا ما هو البرنامج لاستخدامه لعرض الملف.


حاول استخدامها:

Uri uri =  Uri.fromFile(entry);
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
String mime = "*/*";
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
if (mimeTypeMap.hasExtension(
    mimeTypeMap.getFileExtensionFromUrl(uri.toString())))
    mime = mimeTypeMap.getMimeTypeFromExtension(
        mimeTypeMap.getFileExtensionFromUrl(uri.toString()));
intent.setDataAndType(uri,mime);
startActivity(intent);

المشكلة في إظهار ملف باستخدام Intent.ACTION_VIEW ، هي أنك إذا قمت بتمرير Uri Intent.ACTION_VIEW المسار. لا يعمل في جميع الحالات. لإصلاح هذه المشكلة ، يجب عليك استخدام:

Uri.fromFile(new File(filePath));

بدلا من:

Uri.parse(filePath);

تصحيح

هنا هو الرمز الكامل الخاص بي:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(mediaFile.filePath)), mediaFile.getExtension());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

معلومات

MediaFile هو فئة المجال الخاصة بي إلى التفاف الملفات من قاعدة البيانات في الكائنات. إرجاع MediaFile.getExtension() String مع Mimetype لملحق الملف. مثال: "image/png"

الرمز المؤقت: مطلوب لإظهار أي ملف (ملحق)

import android.webkit.MimeTypeMap;

public String getExtension () {
    MimeTypeMap myMime = MimeTypeMap.getSingleton();
    return myMime.getMimeTypeFromExtension(MediaFile.fileExtension(filePath));
}

public static String fileExtension(String path) {
    if (path.indexOf("?") > -1) {
        path = path.substring(0, path.indexOf("?"));
    }
    if (path.lastIndexOf(".") == -1) {
        return null;
    } else {
        String ext = path.substring(path.lastIndexOf(".") + 1);
        if (ext.indexOf("%") > -1) {
            ext = ext.substring(0, ext.indexOf("%"));
        }
        if (ext.indexOf("/") > -1) {
            ext = ext.substring(0, ext.indexOf("/"));
        }
        return ext.toLowerCase();
    }
}

يرجى إعلامي إذا كنت بحاجة إلى المزيد من الشفرات.


بلدي الحل

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath()+"/your_app_folder/"+"your_picture_saved_name"+".png")), "image/*");
context.startActivity(intent);

لا توجد فرصة تقريبًا لاستخدام تطبيق الصور أو المعرض (قد تكون موجودة) ، ولكن يمكنك تجربة عارض المحتوى.

يرجى الخروج إجابة أخرى على سؤال مماثل here


أنا استخدم هذا يعمل بالنسبة لي

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
"Select Picture"), 1);

الإجابة المقبولة لم تكن تعمل لي ،

ما الذي نجح:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" + "/sdcard/test.jpg"), "image/*");
startActivity(intent);






android-image