Android की डिफ़ॉल्ट गैलरी छवि दर्शक में URI का उपयोग करके एक छवि खोलें


84

मैंने छवि uri निकाली है, अब मैं Android के डिफ़ॉल्ट छवि दर्शक के साथ छवि खोलना चाहूंगा। या इससे भी बेहतर, उपयोगकर्ता छवि को खोलने के लिए किस प्रोग्राम का उपयोग कर सकता है। यदि आप फ़ाइल खोलने का प्रयास करते हैं तो फ़ाइल खोजकर्ता आपको कुछ प्रदान करते हैं।

जवाबों:


168

स्वीकृत जवाब मेरे लिए काम नहीं कर रहा था,

क्या काम किया था:

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

4
हाँ, लेकिन आप एंड्रॉइड 2.2 और 2.3 पर एवीड कैसे करते हैं कि 10 सेकंड काली स्क्रीन इंतज़ार कर रही है, जबकि गैलरी का कहना है कि यह नए फोटोज और एल्बमों की खोज करता है?
अधिकतम ४०

@ max4ever: समस्या का समाधान मिल गया है?
Code_Life

4
हां,File f = new File(..., ...); if (f.isFile()) { MediaScannerConnection.scanFile(SchedaActivity.this, new String[] { f.toString() }, null, new MediaScannerConnection.OnScanCompletedListener() { @Override public void onScanCompleted(String path, Uri uri) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, "image/*"); SchedaActivity.this.startActivityForResult(intent, SchedaActivity.this.ACTIVITY_CODE); } });
अधिकतम ४

1
एंड्रॉइड 4.1 आपको छवि दिखाएगा यदि आप केवल "छवि / *" निर्दिष्ट करते हैं। यह एंड्रॉइड 2.3 पर काम नहीं करेगा। आप माइम प्रकार निर्दिष्ट करें: "छवि / जेपीईजी"।
AndroidDev

6
यह उत्तर समाप्त होता है file:///sdcard...- क्या वह जानबूझकर है?
डेनियल आयटेकिन

38

यदि आपका ऐप Android N (7.0) और इसके बाद के संस्करण को लक्षित करता है, तो आपको ऊपर दिए गए उत्तर ("Uri.fromFile" विधि) का उपयोग नहीं करना चाहिए, क्योंकि यह आपके लिए काम नहीं करेगा।

इसके बजाय, आपको एक ContentProvider का उपयोग करना चाहिए।

उदाहरण के लिए, यदि आपकी छवि फ़ाइल बाहरी फ़ोल्डर में है, तो आप इसका उपयोग कर सकते हैं (मेरे द्वारा यहां बनाए गए कोड के समान ):

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

प्रकट:

<provider
    android:name="androidx.core.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>

रेस / 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" बनाया है।


हां केवल यह काम करता है और एंड्रॉइड एन और ओरेओ से मेरे मुद्दे को हल करता है। बहुत धन्यवाद। तुम पूरी तरह ठीक हो!
सर्ल बर्लका

बहुत बहुत धन्यवाद!! केवल यही समाधान एंड्रॉइड के नए संस्करणों के लिए काम करता है
दिवाकर राजेश

क्या यह साझा स्थान (एसडी कार्ड) में सहेजी गई फाइलों पर भी लागू होता है?
अल्बर्ट 221

@ Albert221 यह होना चाहिए, लेकिन मुझे नहीं लगता कि मैंने इसका परीक्षण किया है। कृपया कोशिश करें और मुझे बताएं।
Android डेवलपर

एंड्रॉइड 10 के लिए काम नहीं करता है जब मेरे पास गैलरी के लिए उरी एक छवि है
rommex

29

खुद से पूछें, खुद भी जवाब दें:

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

यह भी पूछेगा कि फ़ाइल देखने के लिए किस प्रोग्राम का उपयोग करना है।


2
हाय हरि, आपका कोड छवि खोलने के लिए उपयोगी है। क्या आपके पास गैलरी का फ़ोल्डर खोलने का कोई समाधान हो सकता है। यहाँ मेरा सवाल है stackoverflow.com/questions/6519024/…
djk

@djk मैं अभी इस खोज का जवाब यहां देता हूं stackoverflow.com/questions/6074270/… देखें कि क्या यह आपके प्रश्न से संबंधित है।
पीयूषमिश्रा

बस किसी और के रूप में एक ही समस्या पर फंस जाता है मेरे रूप में - मैंने इरादा जोड़ा ।सेट टाइप ("छवि / पीएनजी") (मुझे पता था कि छवि एक पीएनजी फ़ाइल होगी) और इसने गैलरी को छवि को खोलने से रोक दिया! तो .setType यहां प्रति-उत्पादक है :)
डेनियल

इसके अतिरिक्त, आप intent.setDataAndType(uri, "image/*");एक छवि देखने वाले ऐप का उपयोग करने के लिए एंड्रॉइड को मजबूर करने के लिए उपयोग कर सकते हैं ।
डिएगो स्टिहल

क्या केवल छवि देखने के लिए एक नया लेआउट बनाने से बचने के लिए इस पद्धति का उपयोग किया जा सकता है?
मारेक

21

इसका उपयोग करने की कोशिश करें:

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.getData () "त्रुटि के माध्यम से ऐप से परे उजागर हुआ"।
रमिज़ अंसारी

यदि आपको Intent.getData () के माध्यम से "एप्लिकेशन से परे उजागर किया जा रहा है" तो आप इस समस्या को हल करने के लिए इस लिंक की जांच कर सकते हैं stackoverflow.com/a/45751453/10619147
Wojuola Ayotola

18

विकास उत्तर के आधार पर लेकिन एक मामूली संशोधन के साथ: उड़ी को पैरामीटर द्वारा प्राप्त किया जाता है:

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

1
यह एक ही फ़ोल्डर में केवल चयनित छवि और अन्य छवियों को नहीं दिखाता है (ताकि उपयोगकर्ता अन्य छवियों को देखने के लिए बाएं / दाएं स्वाइप कर सके)। किसी भी विचार यह कैसे प्राप्त करने के लिए?
अतुल

@ उस मामले में उपयोग का मामला पूरी तरह से अलग है। ओपी अपने यूआरआई का उपयोग करके एक एक्स छवि प्रदर्शित करना चाहता है। ऐसा लगता है कि आप) गैलरी को निर्धारित स्थिति में खोलना चाहते हैं या बी) गैलरी में खोलें तस्वीरों का एक सबसेट जिसमें आपके पास यूआरआई हैं। वेब पर कुछ शोध करें या एक नया प्रश्न पूछें, क्योंकि आपका उपयोग मामला पूरी तरह से अलग है।
जोक्विन इराचुक

आपके त्वरित उत्तर के लिए धन्यवाद। मुझे वही हासिल करना होगा जो ओपी ने पूछा है। आपके और विकास के) उत्तर इसे बहुत अच्छी तरह से प्राप्त करते हैं, केवल एक चीज है, एक बार जब यह छवि दिखाता है तो यह एक ही फ़ोल्डर में अन्य छवियों के माध्यम से स्क्रॉल करने की अनुमति नहीं देता है (जब उपयोगकर्ता बाएं या दाएं स्वाइप करता है)। मैंने कई दर्शक (उदाहरण के लिए व्हाट्सएप) गैलरी दर्शक (जैसे आप क्या करते हैं) में छवि देखी है, लेकिन वे उपयोगकर्ता को एक ही फ़ोल्डर में बाईं दाईं ओर स्क्रॉल करने की भी अनुमति देते हैं।
अतुल

@ अतुल ओपी अपनी यूआरआई दी गई गैलरी के साथ एक छवि खोलना चाहता है । WhatsApp कार्यान्वयन पूरी तरह से अलग है। मुझे नहीं पता कि गैलरी कई यूआरआई के साथ एक आशय प्राप्त करने का समर्थन करती है। वैसे भी, इसे देखें , यह आपकी मदद कर सकता है।
जोकिन इचुक

मैंने पहले ही आपके द्वारा दिए गए लिंक को देख लिया था। फिर भी धन्यवाद। लेकिन मैंने पाया कि किसी ने पहले से ही एक प्रश्न पोस्ट कर दिया है कि मुझे क्या चाहिए। हालांकि, उनका जवाब समझने के लिए बहुत संक्षिप्त है।
अतुल

11

यदि आपका Android N और नीचे काम कर रहा है तो यह बात मदद कर सकती है

 File file=new File(Environment.getExternalStorageDirectory()+"/directoryname/"+filename);
        Uri path= FileProvider.getUriForFile(MainActivity.this,BuildConfig.APPLICATION_ID + ".provider",file);

        Intent intent=new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(path,"image/*");
        intent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); //must for reading data from directory

FLAG_GRANT_READ_URI_PERMISSION ने Intent.ACTION_VIEW का उपयोग करके छवि को देखने में मदद की
Pavan

मेरे लिए काम किया। बस याद रखें कि यदि आप "आशय का प्रयोग कर रहे हैं ।setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);" इसके बाद आपको "आशय .setFlags (FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION) जोड़ना होगा;" उसके बाद .. भयानक समाधान के लिए धन्यवाद।
स्नेहल अग्रवाल

6

एक बहुत साफ, इस समस्या का सुरक्षित जवाब (आपको वास्तव में हार्ड कोड स्ट्रिंग्स नहीं चाहिए):

public void openInGallery(String imageId) {
  Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon().appendPath(imageId).build();
  Intent intent = new Intent(Intent.ACTION_VIEW, uri);
  startActivity(intent);
}

आपको केवल EXTERNAL_CONTENT_URI के लिए पथ के अंत में छवि आईडी संलग्न करना है । फिर व्यू एक्शन और उरी के साथ एक इंटेंट लॉन्च करें।

छवि आईडी सामग्री रिज़ॉल्वर को क्वेरी करने से आती है।


क्या यह उपयोगकर्ता को उसी फ़ोल्डर में अन्य छवियों के माध्यम से स्वाइप और स्क्रॉल करने की अनुमति देता है?
अतुल

4

ऊपर दिए गए सभी उत्तर छवि को नहीं खोल रहे हैं .. जब दूसरी बार खोलने की कोशिश करता हूं तो यह गैलरी दिखाता है छवि नहीं।

मुझे विभिन्न 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);

यह केवल मेरे लिए काम किया ..


4

फ़ाइल का उपयोग करके दिखाने के साथ समस्या यह Intent.ACTION_VIEWहै कि यदि आप Uriपार्सिंग पथ को पास करते हैं । सभी मामलों में काम नहीं करता है। उस समस्या को ठीक करने के लिए, आपको उपयोग करने की आवश्यकता है:

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()देता है । उदाहरण:StringMimetype"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();
    }
}

यदि आपको अधिक कोड की आवश्यकता है, तो मुझे बताएं।


3

मैं इसका उपयोग करता हूं यह मेरे लिए काम करता है

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

2

फ़ाइल प्रदाता का उपयोग करके मेरा समाधान

    private void viewGallery(File file) {

 Uri mImageCaptureUri = FileProvider.getUriForFile(
  mContext,
  mContext.getApplicationContext()
  .getPackageName() + ".provider", file);

 Intent view = new Intent();
 view.setAction(Intent.ACTION_VIEW);
 view.setData(mImageCaptureUri);
 List < ResolveInfo > resInfoList =
  mContext.getPackageManager()
  .queryIntentActivities(view, PackageManager.MATCH_DEFAULT_ONLY);
 for (ResolveInfo resolveInfo: resInfoList) {
  String packageName = resolveInfo.activityInfo.packageName;
  mContext.grantUriPermission(packageName, mImageCaptureUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
 }
 view.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 Intent intent = new Intent();
 intent.setAction(Intent.ACTION_VIEW);
 intent.setDataAndType(mImageCaptureUri, "image/*");
 mContext.startActivity(intent);
}

0

फ़ोटो या गैलरी एप्लिकेशन (एक मौजूद हो सकता है) का उपयोग करने का लगभग कोई मौका नहीं है , लेकिन आप सामग्री-दर्शक की कोशिश कर सकते हैं।

कृपया इसी तरह के प्रश्न का एक और उत्तर चेकआउट करें


0

मेरा समाधान

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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.