অ্যান্ড্রয়েড অভিপ্রায় ফিল্টার: ফাইল এক্সটেনশনের সাথে সহযোগী অ্যাপ্লিকেশন


93

আমার একটি কাস্টম ফাইল টাইপ / এক্সটেনশন রয়েছে যা আমি আমার অ্যাপ্লিকেশনটির সাথে সংযুক্ত করতে চাই।

যতদূর আমি জানি, ডেটা উপাদানটি এই উদ্দেশ্যে তৈরি করা হয়েছে, তবে আমি এটি কাজ করতে পারি না। http://developer.android.com/guide/topics/manifest/data-element.html ডক্স এবং প্রচুর ফোরাম পোস্ট অনুসারে এটির মতো কাজ করা উচিত:

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:mimeType="application/pdf" />
</intent-filter>

ভাল, এটি কাজ করে না। আমি কি ভুল করছি? আমি কেবল নিজের ফাইলের প্রকারটি ঘোষণা করতে চাই।


অ্যান্ড্রয়েড যুক্ত করুন: উদ্দিষ্ট ফিল্টারে লেবেল = "@ স্ট্রিং / অ্যাপ_নাম"
প্রশান্ত

উত্তর:


117

আপনি যে পরিস্থিতিটি পরিচালনা করতে চান তার জন্য আপনার একাধিক অভিপ্রায় ফিল্টারগুলির প্রয়োজন।

উদাহরণ 1, মাইম টাইপ ছাড়াই http অনুরোধগুলি হ্যান্ডেল করুন:

  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http" />
    <data android:host="*" />
    <data android:pathPattern=".*\\.pdf" />
  </intent-filter>

মাইমটাইপগুলি সহ পরিচালনা করুন, যেখানে প্রত্যয়টি অপ্রাসঙ্গিক:

  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http" />
    <data android:host="*" />
    <data android:mimeType="application/pdf" />
  </intent-filter>

একটি ফাইল ব্রাউজার অ্যাপ্লিকেশন থেকে অভিপ্রায় পরিচালনা করুন:

  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="file" />
    <data android:host="*" />
    <data android:pathPattern=".*\\.pdf" />
  </intent-filter>

আমি ভেবেছিলাম যে হোস্ট = "*" বাদ দেওয়া যেতে পারে তবে এটি খুব বিস্তৃত হতে শুরু করেছে।
ফিরুম চা

4
@ ফিরুম চা: আমার অ্যাপ্লিকেশনটি ব্যবহার করে অন্য অ্যাপ্লিকেশনটিতে কোনও ফাইল এক্সটেনশন সংযুক্ত করার কোনও উপায় আছে কি? আমার অ্যাপ্লিকেশনটি তালিকাভুক্ত ফাইল তৈরি করে যা আমি অ্যান্ড্রয়েডকে বলতে চাই যে তারা পাঠ্য ফাইল এবং কোনও পাঠ্য সম্পাদক দিয়ে এগুলি খুলতে (আমার অ্যাপটি কোনও পাঠ্য সম্পাদক নয়)।
লুইস এ। ফ্লোরিট

@ LuisA.Florit আপনি কি আপনার ফাইল * .txt কল করার চেষ্টা করেছিলেন? এটি কাজ করতে পারে।
গ্যাব্রিয়েল

কাস্টম এক্সটেনশন মাইমটাইপের সাথে কাজ করছে না। আমি যদি মাইমটাইপ হিসাবে দিই / আমার অ্যাপ্লিকেশনটি প্রদর্শিত হয় যখন আমি জিমেইল বিজ্ঞপ্তিটিও ক্লিক করি।
মদন ভি

4
কাজ হচ্ছে না .. আমি গত 2 দিন ধরে অনুসন্ধান করছি এখন কাজ হয়নি। আমি অ্যান্ড্রয়েড 9 ব্যবহার করছি
আহমদ আরসলান

49

আমি যোগ না করা পর্যন্ত অন্যান্য সমাধানগুলি আমার জন্য নির্ভরযোগ্যভাবে কাজ করে না:

android:mimeType="*/*" 

এর আগে এটি কিছু অ্যাপ্লিকেশনগুলিতে কাজ করেছিল, কিছুতে নয় ...

আমার জন্য সম্পূর্ণ সমাধান:

<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="file"  android:host="*" android:pathPattern=".*\\.EXT" android:mimeType="*/*"  />
</intent-filter>

4
কি দারুন! এটি আমাকে সাহায্য করেছে। দেখে মনে হচ্ছে অ্যান্ড্রয়েড ডকুমেন্টেশনটি ভুল। সমস্ত (স্কিম, হোস্ট, পথ [প্যাটার্ন], মাইমটাইপ) কাজ করার জন্য ঘোষণা করতে হবে
গ্যাভ্রিয়েল

আপনি সম্পূর্ণ হতে চাইলে ছাড়া আপনার সাথে একটি এবং একটি উভয়ই নিয়ম থাকা উচিত mimeType। দেখুন developer.android.com/guide/components/...
অ্যান্ড্রু সূর্যের

4
আপনি যদি জিমেইল থেকে নিজের ফাইল অ্যাপটি খুলতে চান?
ইগোরগানাপলস্কি

32

কর্তৃক প্রদত্ত answeres Phyrum চা এবং yuku ইতিমধ্যে খুব তথ্যপূর্ণ হয়।

আমি যুক্ত করতে চাই যে অ্যান্ড্রয়েড .0.০ নুগ্যাট দিয়ে শুরু করে অ্যাপ্লিকেশনগুলির মধ্যে ফাইল ভাগ করে নেওয়ার পদ্ধতিতে পরিবর্তন রয়েছে:

অফিসিয়াল অ্যান্ড্রয়েড 7.0 পরিবর্তনগুলি থেকে :

অ্যান্ড্রয়েড .0.০ লক্ষ্যযুক্ত অ্যাপ্লিকেশানের জন্য, অ্যান্ড্রয়েড ফ্রেমওয়ার্ক স্ট্রাইকডমোডি এপিআই নীতি প্রয়োগ করে যা আপনার অ্যাপ্লিকেশনটির বাইরে ফাইলটি // ইউআরআই প্রকাশ করা নিষিদ্ধ করে। যদি কোনও ফাইল ইউআরআই সমন্বিত কোনও অভিপ্রায় আপনার অ্যাপ্লিকেশনটি ছেড়ে দেয় তবে অ্যাপ্লিকেশনটি ফাইল ইউরি এক্সপোজড এক্সসেপশন ব্যতিক্রম সহ ব্যর্থ হয়।

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

যদি আপনার নিজস্ব কাস্টম ফাইলটি নির্দিষ্ট ছাড়াই শেষ হয় mime-type(বা আমি অনুমান করি এমন একটিও) আপনার এটির সাথে কাজ করার জন্য schemeআপনাকে একটি দ্বিতীয় মান যুক্ত করতে হতে পারে ।intent-filterFileProviders

উদাহরণ:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <data android:scheme="file" />
    <data android:scheme="content" />
    <data android:mimeType="*/*" />
    <!--
        Work around Android's ugly primitive PatternMatcher
        implementation that can't cope with finding a . early in
        the path unless it's explicitly matched.
    -->
    <data android:host="*" />
    <data android:pathPattern=".*\\.sfx" />
    <data android:pathPattern=".*\\..*\\.sfx" />
    <data android:pathPattern=".*\\..*\\..*\\.sfx" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\.sfx" />
    <!-- keep going if you need more -->

</intent-filter>

এখানে গুরুত্বপূর্ণ বিষয়টি হ'ল সংযোজন

<data android:scheme="content" />

ফিল্টার।

পুরানো সংস্করণগুলিতে সবকিছু ঠিকঠাক থাকা অবস্থায় অ্যান্ড্রয়েড .0.০ ডিভাইসগুলিতে আমার ক্রিয়াকলাপটি খোলার থেকে বিরত রেখে এই সামান্য পরিবর্তন সম্পর্কে জানতে আমার বেশ কষ্ট হয়েছিল। আমি আশা করি এটি কাউকে সাহায্য করবে


এই টিপ এবং অতিরিক্ত তথ্য ছাড়া আমি আমার অ্যাপ্লিকেশনটি ফাইল এক্সপ্লোরারদের সাথে নিবন্ধভুক্ত করতে পারি না। এটি অত্যন্ত গুরুত্বপূর্ণ এবং এটি
উত্সাহিত

তুমি একটা দিন বাঁচিয়েছ! বড় টিএনএক্স। এই উত্তর গ্রহণ করা উচিত!
অ্যান্ডিস

You আপনি যদি বিষয়বস্তু স্কিমের মাধ্যমে ফাইলটি সরবরাহ করার চেষ্টা করেন, যেমন File(uri.path), এটি ক্রাশ No such file or directoryহবে - নওগাট + সমর্থন করার জন্য আপডেট করার সময় সেই দৃশ্যটি অন্যরকমভাবে পরিচালনা করতে হবে!
জর্দান এইচ

20

আমার অনুসন্ধানগুলি:

কোনও ফাইল পুনরুদ্ধার করার বিভিন্ন উপায় নিয়ে কাজ করতে আপনার বেশ কয়েকটি ফিল্টার প্রয়োজন। অর্থাত্, জিমেইল সংযুক্তি দ্বারা, ফাইল এক্সপ্লোরার দ্বারা, এইচটিটিপি দ্বারা, এফটিপি দ্বারা ... এঁরা সকলেই খুব আলাদা ইন্টেন্ট প্রেরণ করেন।

এবং আপনার ক্রিয়াকলাপের কোডগুলিতে আপনার ক্রিয়াকলাপটিকে ট্রিগার করতে পারে এমন অভিপ্রায়টি ফিল্টার করে ফেলতে হবে।

নীচের উদাহরণের জন্য, আমি একটি জাল ফাইল টাইপ new.mrz তৈরি করেছি। এবং আমি এটি জিমেইল সংযুক্তি এবং ফাইল এক্সপ্লোরার থেকে পুনরুদ্ধার করেছি।

ক্রিয়াকলাপটি অনক্রিট () এ যুক্ত হয়েছে:

        Intent intent = getIntent();
        String action = intent.getAction();

        if (action.compareTo(Intent.ACTION_VIEW) == 0) {
            String scheme = intent.getScheme();
            ContentResolver resolver = getContentResolver();

            if (scheme.compareTo(ContentResolver.SCHEME_CONTENT) == 0) {
                Uri uri = intent.getData();
                String name = getContentName(resolver, uri);

                Log.v("tag" , "Content intent detected: " + action + " : " + intent.getDataString() + " : " + intent.getType() + " : " + name);
                InputStream input = resolver.openInputStream(uri);
                String importfilepath = "/sdcard/My Documents/" + name; 
                InputStreamToFile(input, importfilepath);
            }
            else if (scheme.compareTo(ContentResolver.SCHEME_FILE) == 0) {
                Uri uri = intent.getData();
                String name = uri.getLastPathSegment();

                Log.v("tag" , "File intent detected: " + action + " : " + intent.getDataString() + " : " + intent.getType() + " : " + name);
                InputStream input = resolver.openInputStream(uri);
                String importfilepath = "/sdcard/My Documents/" + name; 
                InputStreamToFile(input, importfilepath);
            }
            else if (scheme.compareTo("http") == 0) {
                // TODO Import from HTTP!
            }
            else if (scheme.compareTo("ftp") == 0) {
                // TODO Import from FTP!
            }
        }

জিমেইল সংযুক্তি ফিল্টার:

        <intent-filter android:label="@string/app_name">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="content" />
            <data android:mimeType="application/octet-stream" />
        </intent-filter>
  • লোগো: সামগ্রীর উদ্দেশ্য সনাক্ত: অ্যান্ড্রয়েড.আইএনটি.অ্যাকশন.ভিউ: সামগ্রী: //gmail-ls/l.foul@gmail.com/messages/2950/attachments/0.1/BEST/false: অ্যাপ্লিকেশন / অকটেট-স্ট্রিম: নতুন। মিঃ

ফাইল এক্সপ্লোরার ফিল্টার:

        <intent-filter android:label="@string/app_name">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file" />
            <data android:pathPattern=".*\\.mrz" />
        </intent-filter>
  • লোগো: ফাইলের উদ্দেশ্য সনাক্ত করা হয়েছে: android.intent.action.view: ফাইল: ///storage/sdcard0/My%20 ডকুমেন্টস / new.mrz: নাল: new.mrz

এইচটিটিপি ফিল্টার:

        <intent-filter android:label="@string/rbook_viewer">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="http" />
            <data android:pathPattern=".*\\.mrz" />
        </intent-filter>

উপরে ব্যবহৃত ব্যক্তিগত ফাংশন:

private String getContentName(ContentResolver resolver, Uri uri){
    Cursor cursor = resolver.query(uri, null, null, null, null);
    cursor.moveToFirst();
    int nameIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
    if (nameIndex >= 0) {
        return cursor.getString(nameIndex);
    } else {
        return null;
    }
}

private void InputStreamToFile(InputStream in, String file) {
    try {
        OutputStream out = new FileOutputStream(new File(file));

        int size = 0;
        byte[] buffer = new byte[1024];

        while ((size = in.read(buffer)) != -1) {
            out.write(buffer, 0, size);
        }

        out.close();
    }
    catch (Exception e) {
        Log.e("MainActivity", "InputStreamToFile exception: " + e.getMessage());
    }
}

ক্রিয়াকলাপটি কি লঞ্চার বা মূল ধরণের হতে হবে? কারণ আমি জিমেইল সংযুক্তি ফিল্টার চেষ্টা করেছি এবং এটি কাজ করছে না।
অমিত

15

দ্য pathPattern

<data android:pathPattern=".*\\.pdf" />

".pdf" এর আগে যদি ফাইল পথে এক বা একাধিক ডট থাকে তবে কাজ করে না।

এটি কাজ করবে:

<data android:pathPattern=".*\\.pdf" />
<data android:pathPattern=".*\\..*\\.pdf" />
<data android:pathPattern=".*\\..*\\..*\\.pdf" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.pdf" />

আপনি আরও বিন্দু সমর্থন করতে চাইলে আরও যুক্ত করুন।


4
এখন পর্যন্ত সাব ফোল্ডারগুলিতে যাওয়ার জন্য এটিই একমাত্র বিকল্প
লকিড্রয়েড

আমি একই কোড ব্যবহার করছি তবে আইডিই আমাকে সতর্ক, এই প্রশ্ন দেখতে পাবেন stackoverflow.com/questions/35833776/...
AndreaF

5

আমি যুগ যুগ ধরে এটির জন্য কাজ করার চেষ্টা করছি এবং মূলত সমস্ত প্রস্তাবিত সমাধান চেষ্টা করেছি এবং এখনও নির্দিষ্ট ফাইল এক্সটেনশনগুলি সনাক্ত করতে অ্যান্ড্রয়েড পেতে পারি না। আমার কাছে "*/*"মাইমটাইপযুক্ত একটি ইন্টেন্ট-ফিল্টার রয়েছে যা কেবলমাত্র কাজ করে মনে হয় এবং ফাইল-ব্রাউজারগুলি এখন আমার অ্যাপ্লিকেশনটিকে ফাইল খোলার বিকল্প হিসাবে তালিকাভুক্ত করে, তবে আমার অ্যাপ্লিকেশনটি এখন কোনও ধরণের ফাইল খোলার বিকল্প হিসাবে দেখানো হয়েছে যদিও আমি প্যাথপ্যাটার্ন ট্যাগ ব্যবহার করে নির্দিষ্ট ফাইল এক্সটেনশন নির্দিষ্ট করেছি। এটি এতদূর চলে যায় যে আমি আমার পরিচিতি তালিকায় কোনও পরিচিতি দেখার / সম্পাদনা করার চেষ্টা করার পরেও Android আমাকে জিজ্ঞাসা করে যে আমি আমার অ্যাপ্লিকেশনটি যোগাযোগটি দেখতে ব্যবহার করতে চাই এবং এটি এমন অনেক পরিস্থিতিতে রয়েছে যা খুব বিরক্তিকর।

অবশেষে আমি এই গুগল গ্রুপগুলির পোস্টটি একই প্রশ্নের সাথে পেয়েছি যা সম্পর্কে একজন প্রকৃত অ্যান্ড্রয়েড ফ্রেমওয়ার্ক ইঞ্জিনিয়ার উত্তর দিয়েছে। তিনি ব্যাখ্যা করেছেন যে অ্যান্ড্রয়েড কেবল ফাইল-এক্সটেনশানগুলি সম্পর্কে কিছুই জানেন না, কেবল মাইম টাইপস ( https://groups.google.com/forum/#!topic/android-developers/a7qsSl3vQq0 )।

সুতরাং আমি যা দেখেছি, চেষ্টা করেছি এবং পড়েছি সেগুলি থেকে Android কেবল ফাইল-এক্সটেনশনগুলির মধ্যে পার্থক্য করতে পারে না এবং পথের প্যাটার্ন ট্যাগটি মূলত সময় এবং শক্তির একটি বিশাল অপচয়। আপনি যদি কেবলমাত্র একটি নির্দিষ্ট মাইম-টাইপের (পাঠ্য, ভিডিও বা অডিও বলুন) ফাইলগুলির প্রয়োজনের ভাগ্যবান হন তবে আপনি একটি মাইম-টাইপ সহ একটি ইন্টেন্ট-ফিল্টার ব্যবহার করতে পারেন। আপনার যদি কোনও নির্দিষ্ট ফাইল-এক্সটেনশন বা মাইম-টাইপ দরকার হয় যা অ্যান্ড্রয়েড দ্বারা জানা যায় না তবে আপনি ভাগ্য থেকে দূরে।

আমি যদি এগুলির কোনও সম্পর্কে ভুল হয়ে থাকি তবে দয়া করে আমাকে বলুন, এখন পর্যন্ত আমি প্রতিটি পোস্ট পড়েছি এবং আমি প্রস্তাবিত প্রতিটি সমাধান চেষ্টা করেছি তবে কোনওটিই কাজ করে নি।

এই ধরণের জিনিসগুলি অ্যান্ড্রয়েডে কীভাবে সাধারণ বলে মনে হয় এবং বিকাশকারীদের অভিজ্ঞতা কীভাবে খারাপ হয় তা সম্পর্কে আমি দু'এক পৃষ্ঠা লিখতে পারি, তবে আমি আমার ক্রুদ্ধ বিরক্তি রক্ষা করব;)। আশা করি কাউকে কিছুটা ঝামেলা বাঁচালাম।


5

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

অ্যান্ড্রয়েড 7.0 এ ড্রবপক্সের একটি আকর্ষণীয় আচরণ রয়েছে। এটি যখন কোনও অজানা ফাইল এক্সটেনশনের সাথে মিলিত হয় তখন এটি কোনও ফাইল ইউআরআই অভিপ্রায় তৈরি করে বলে মনে হয় তবে উদ্দেশ্যটি চালু করার পরিবর্তে কোন অ্যাপ্লিকেশনগুলি অভিপ্রায় গ্রহণ করতে পারে তা নির্ধারণের জন্য এটি অপারেটিং সিস্টেমকে কল করে। যদি কেবলমাত্র একটি অ্যাপ্লিকেশন থাকে যা সেই ফাইলটি ইউআরআই গ্রহণ করতে পারে তবে এটি সরাসরি একটি অ্যাপ্লিকেশনটিতে একটি স্পষ্ট সামগ্রী ইউআরআই প্রেরণ করে। সুতরাং ড্রপবক্সের সাথে কাজ করার জন্য আপনার অ্যাপ্লিকেশনটিতে অভিযুক্ত ফিল্টারগুলি পরিবর্তন করার দরকার নেই। এটির জন্য কোনও সামগ্রী ইউআরআই উদ্দেশ্য ফিল্টারের প্রয়োজন হয় না। অ্যাপ্লিকেশনটি আপনার নিজের ফাইল এক্সটেনশনের সাথে একটি সামগ্রী ইউআরআই গ্রহণ করতে পারে এবং অ্যান্ড্রয়েড rop.০ এর আগে যেমন ড্রপবক্সের সাথে কাজ করবে তা নিশ্চিত করুন।

কোনও সামগ্রী ইউআরআই গ্রহণ করতে আমার ফাইল লোডিং কোডের একটি উদাহরণ এখানে দেওয়া হয়েছে:

Uri uri = getIntent().getData();
if (uri != null) {
    File myFile = null;
    String scheme = uri.getScheme();
    if (scheme.equals("file")) {
        String fileName = uri.getEncodedPath();
        myFile = new File(filename);
    }
    else if (!scheme.equals("content")) {
        //error
        return;
    }
    try {
        InputStream inStream;
        if (myFile != null) inStream = new FileInputStream(myFile);
        else inStream = getContentResolver().openInputStream(uri);
        InputStreamReader rdr = new InputStreamReader(inStream);
        ...
    }
}

2

আপনি এটি চেষ্টা করুন এটি আপনার পক্ষে সহায়তা করবে p পিডিএফের স্থিতি আপনি অন্যান্য এক্সটেনশনগুলিও ব্যবহার করতে পারেন। প্রথমে আপনাকে অ্যান্ড্রয়েডম্যান্ফেস্ট.এক্সএমএল ফাইলে পঠিত বাহ্যিক স্টোরেজ অনুমতি যুক্ত করতে হবে।

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

তারপরে অ্যাক্টিভিটি ট্যাগের অ্যান্ড্রয়েডম্যানফিস্ট ফাইলে, আপনি নীচের মত করে একটি উদ্দেশ্য-ফিল্টার যুক্ত করুন।

            <action android:name="android.intent.action.SEND" />

            <action android:name="android.intent.action.VIEW" />

             <category android:name="android.intent.category.DEFAULT" />

            <data android:mimeType= "application/pdf" />

            <data android:host="*" />

        </intent-filter>

শেষ পর্যন্ত আপনার কোডে, আপনি পিডিএফ ফাইলের পথটি নীচের মত দেখিয়েছেন:

Intent intent=getIntent();

if(intent!=null) {          

        String action=intent.getAction();

        String type=intent.getType();

        if(Intent.ACTION_VIEW.equals(action) && type.endsWith("pdf")) {

            // Get the file from the intent object

            Uri file_uri=intent.getData();

            if(file_uri!=null)

                filepath=file_uri.getPath();

            else

                filepath="No file";

        }

        else if(Intent.ACTION_SEND.equals(action) && type.endsWith("pdf")){

            Uri uri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);

            filepath = uri.getPath();

        }

এই ইন্টেন্টের জন্য CTION এটি শুধুমাত্র কিছু নির্দিষ্ট অ্যাপ্লিকেশন থেকে প্রতিবার নয় from কোন সমাধান?
হার্ডিক যোশি

@ হার্দিকজোশি অ্যাপ্লিকেশনগুলি GRANT_READ_URI_PERMISSION এর অনুমতি নির্ধারণ করছে না।
মীরা_কোল

1

যোগ করার চেষ্টা করুন

<action android:name="android.intent.action.VIEW"/>

এখন যে অ্যাপ্লিকেশন / পিডিএফ যেমন ফ্যাক্টরি সেট ফাইল ধরণের সাথে কাজ করে, আমি কীভাবে নিজের ফাইল টাইপ ঘোষণা করব? এবং আমি যখন ফাইল টাইপ বলি, তখন আমার অর্থ মাইমটাইপ;)
টামাস

আপনি এই ধরনের মাইমটাইপটি কী ধরণের ফাইলটি ধরতে চান? এছাড়াও, এই ফাইলটি ব্রাউজার বা ফাইল ম্যানেজার থেকে খোলা হয়েছে বা আপনার তৈরি করা অন্য অ্যাপ্লিকেশন থেকে প্রেরণ করা হয়েছে?
মাগাইও

ব্রাউজার, মেল ক্লায়েন্ট, ফাইল ম্যানেজার বা অন্য কোথাও হতে পারে .. বা আমার নিজস্ব অ্যাপ্লিকেশন :) ফাইল এক্সটেনশনটি কাস্টম দ্বারা নির্দিষ্ট, প্রথাগত।
তামাস

ভাল, আমি এখনও আটকে আছি ... কেউ দয়া করে সাহায্য করতে পারে?
তামাস

@ তমাস আপনি প্রত্যেকে এটি সাজিয়েছেন? আমি এই আটকে আছি!
স্টুস্ট্রিলিং

1

Gmail সংযুক্তির জন্য, আপনি ব্যবহার করতে পারেন:

<intent-filter android:label="@string/app_name">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="content" />
  <data android:mimeType="application/pdf" /> <!-- .pdf -->
  <data android:mimeType="application/msword" /> <!-- .doc / .dot -->
  <data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" /> <!-- .docx -->
  <data android:mimeType="application/vnd.ms-excel" />  <!-- .xls / .xlt / .xla -->
  <data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />  <!-- .xlsx -->
  <data android:mimeType="application/vnd.ms-powerpoint" />  <!-- .ppt / .pps / .pot / .ppa -->
  <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" /> <!-- .pptx -->
  <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.slideshow" /> <!-- .ppsx -->
  <data android:mimeType="application/zip" /> <!-- .zip -->
  <data android:mimeType="image/jpeg" /> <!-- .jpeg -->
  <data android:mimeType="image/png" /> <!-- .png -->
  <data android:mimeType="image/gif" /> <!-- .gif -->
  <data android:mimeType="text/plain" /> <!-- .txt / .text / .log / .c / .c++ / ... -->

যতটা প্রয়োজন মাইম টাইপ করুন। আমার প্রকল্পের জন্য আমার কেবল এটি দরকার।


1
         <!--
            Works for Files, Drive and DropBox
        -->
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file" />
            <data android:mimeType="*/*" />
            <data android:host="*" />
            <data android:pathPattern=".*\\.teamz" />
        </intent-filter>

        <!--
            Works for Gmail
        -->
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.BROWSABLE" />
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:host="gmail-ls" android:scheme="content" android:mimeType="application/octet-stream"/>
        </intent-filter>

লক্ষ্য করুন যে এটি আপনার অ্যাপ্লিকেশনটি সমস্ত জিমেইল ফাইল সংযুক্তিগুলি খুলবে, এটির আশপাশে কাজ করার কোনও উপায় নেই


এটি কেবল .teamz
ইগোরগানাপলস্কি

1

@ ইউকু এবং @ ফিরুম-চা উত্তর হিসাবে যাঁরা অন্যান্য ফাইল ম্যানেজার \ এক্সপ্লোরার অ্যাপ্লিকেশনগুলিতে সমস্যা করছেন তারা

এটি এলজি ডিফল্ট ফাইল ম্যানেজার অ্যাপের সাথে কাজ করে

     <intent-filter android:label="@string/app_name_decrypt">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file" />
            <data android:pathPattern=".*\\.lock" />
            <data android:pathPattern=".*\\..*\\.lock" />
            <data android:pathPattern=".*\\..*\\..*\\.lock" />
        </intent-filter>

ES ফাইল এক্সপ্লোরার এবং অন্যান্য ফাইল পরিচালকদের সাথে কাজ করতে পারেনি তাই আমি যুক্ত করেছি

 android:mimeType="*/*"

তারপরে এটি ইএস এক্সপ্লোরারের সাথে কাজ করে তবে এলজি ফাইল ম্যানেজার ফাইলের ধরণ সনাক্ত করতে পারেনি তাই আমার সমাধান

     <intent-filter android:label="@string/app_name_decrypt">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file" />
            <data android:pathPattern=".*\\.lock" />
            <data android:pathPattern=".*\\..*\\.lock" />
            <data android:pathPattern=".*\\..*\\..*\\.lock" />
        </intent-filter>
        <intent-filter android:label="@string/app_name_decrypt">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file"/>
            <data android:scheme="content" />
            <data android:mimeType="*/*" />
            <data android:pathPattern=".*\\.lock" />
            <data android:pathPattern=".*\\..*\\.lock" />
            <data android:pathPattern=".*\\..*\\..*\\.lock" />
        </intent-filter>

1

বিষয়বস্তু ইউআরআই ftw, এবং ম্যানিফেস্টে অভিপ্রায় ফিল্টার সহ ... যদি আপনার ফাইলগুলির একটি কাস্টম এক্সটেনশন থাকে। Micz, একটি মেলা মাইম টাইপ যুক্ত করুন:

        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />

            <data
                android:host="*"
                android:mimeType="application/xyz"
                android:scheme="content" />
        </intent-filter>

ইমেলের মতো কিছু অ্যাপ্লিকেশনটি এক্সটেনশানটিকে মাইম প্রকারে রূপান্তরিত করে। এখন আমি ইমেলের সংযুক্তিতে ক্লিক করতে এবং এটি আমার অ্যাপে খুলতে পারি।


1

কোটলিনে খোলার ফাইলটি পড়ুন:

private fun checkFileOpening(intent: Intent) {
    if (intent.action == Intent.ACTION_VIEW && (intent.scheme == ContentResolver.SCHEME_FILE
                    || intent.scheme == ContentResolver.SCHEME_CONTENT)) {

        val text = intent.data?.let {
            contentResolver.openInputStream(it)?.bufferedReader()?.use(BufferedReader::readText) 
        }
    }
}

-1

ক্রিয়াকলাপের ট্যাগের ভিতরে এই ইন্টেন্ট ফিল্টারটি ম্যানিফেস্টে রাখুন আপনি ফাইলটি ছোঁয়া খুলতে চান:

<intent-filter android:priority="999">
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.OPENABLE" />

    <data android:host="*" />
    <data android:mimeType="application/octet-stream" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\.yourextension" />
    <data android:scheme="content" />
</intent-filter>

-1

// আমি এই কোড চেষ্টা করেছি। এবং এটি ভাল কাজ করছে। আপনি পিডিএফ ফাইল গ্রহণ করতে এই কোডটি ব্যবহার করতে পারেন।

<intent-filter>
   <action android:name="android.intent.action.SEND" />
   <category android:name="android.intent.category.DEFAULT" />
   <data android:mimeType="application/pdf" />
   <data android:pathPattern=".*\\.pdf" />
   <data android:pathPattern=".*\\..*\\.pdf" />
   <data android:pathPattern=".*\\..*\\..*\\.pdf" />
   <data android:pathPattern=".*\\..*\\..*\\..*\\.pdf" />
</intent-filter>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.