ব্যতিক্রম 'ওপেন ব্যর্থ হয়েছে: অ্যান্ড্রয়েডে EACCES (অনুমতি অস্বীকৃত)'


297

আমি পাচ্ছি

উন্মুক্ত ব্যর্থ: EACCES (Permission denied)

লাইনে OutputStream myOutput = new FileOutputStream(outFileName);

আমি রুটটি পরীক্ষা করেছিলাম, এবং চেষ্টা করেছি android.permission.WRITE_EXTERNAL_STORAGE

আমি কিভাবে এই সমস্যা ঠিক করতে পারবো?

try {
    InputStream myInput;

    myInput = getAssets().open("XXX.db");

    // Path to the just created empty db
    String outFileName = "/data/data/XX/databases/"
            + "XXX.db";

    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    // Transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }

    // Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();
    buffer = null;
    outFileName = null;
}
catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

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

এই আমাকে মীমাংসিত stackoverflow.com/questions/33666071/...
পার্থ

উত্তর:


236

আমারও একই সমস্যা <uses-permissionছিল ... ভুল জায়গায় ছিল। এটা ঠিক:

 <manifest>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        ...
        <application>
            ...
            <activity> 
                ...
            </activity>
        </application>
    </manifest> 

uses-permissionট্যাগ বাহিরে হওয়া প্রয়োজন applicationট্যাগ।


2
এটি হ'ল ব্যবহারের অনুমতিটি অ্যাপ্লিকেশনের বাইরে থাকা দরকার
ব্যবহারকারীর 462990

3
আমি একটি সতর্কতা পেয়েছি: " <uses-permission>ট্যাগ পরে <application>ট্যাগ উপস্থিত হয় "
এমআর 5

11
অ্যান্ড্রয়েডে সতর্কতা ৪.৪.৪ প্যারামিটার ব্যবহার করবেন না android:maxSdkVersion="18"। এটি এই ব্যতিক্রমটি তৈরি
করছিল

1
এই অনুমতিটি এপিআই স্তরের 19 থেকে শুরু করে প্রয়োগ করা হয় API
জার ই আহমের

1
আমি API lvl 15 ব্যবহার করছি, ওটিজি ইউএসবি স্টিকের কাছে ফাইলটি সরানোর চেষ্টা করার সময় আমি ত্রুটি পেয়েছি
রবি মেহতা

330

এপিআই 23+ এর জন্য আপনার পড়ার / লেখার অনুমতিগুলির অনুরোধ করতে হবে যদিও তারা ইতিমধ্যে আপনার মেনিফেস্টে রয়েছে।

// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};

/**
 * Checks if the app has permission to write to device storage
 *
 * If the app does not has permission then the user will be prompted to grant permissions
 *
 * @param activity
 */
public static void verifyStoragePermissions(Activity activity) {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We don't have permission so prompt the user
        ActivityCompat.requestPermissions(
                activity,
                PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE
        );
    }
}

Andro আইডি

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

23+++ এর জন্য অনুমতিগুলির অনুরোধের বিষয়ে অফিসিয়াল ডকুমেন্টেশনের জন্য, https://developer.android.com/training/permission/requesting.html দেখুন


13
কেবল স্পষ্ট করে বলার জন্য, এটি কাজ করার জন্য ক্রিয়াকলাপটি অবশ্যই ক্রিয়াকলাপের অনুমতিগুলির অনুরোধের প্রতিক্রিয়াটি পরিচালনা করবে। আরও তথ্যের জন্য বিকাশকারী.অ্যান্ড্রয়েড / ট্রেনিং / স্পিকার / দেখুন …
kldavis4

ব্যাখ্যা এবং উদাহরণের সাথে এখানে সহজ
পল আলেকজান্ডার

1
এটা কি খারাপ জিনিস না? ব্যবহারকারীর অভিজ্ঞতার সাথে শ্রদ্ধা সহ।
এম উসমান খান

5
তবে আমি এটি কোথায় ব্যবহার করব? উদাহরণস্বরূপ, আমি যদি ছবি তুলতে চাই, তবে কি আমাকে স্টার্টঅ্যাক্টিভিটিআরসাল্টের আগে যাচাই-স্টোরেজ পারফর্মেশন চালাতে হবে, বা অনঅ্যাক্টিভিটিস রেজাল্টে? এটা সত্যিই আমাকে বিভ্রান্ত করে।
কিভি লি

3
ধন্যবাদ এই আমার সমস্যার সমাধান। কেবল একটি নোট: যদি কেউ "ম্যানিফেস্ট.প্রিমেশন" সমাধান করতে না পারে তবে আপনাকে কেবল "আমদানি অ্যান্ড্রয়েড M ম্যানিফেস্ট" আমদানি করতে হবে।
ওবায়দা আলকুরান

166

অ্যান্ড্রয়েড কিউতে গুগলের একটি নতুন বৈশিষ্ট্য রয়েছে : বাহ্যিক স্টোরেজের জন্য ফিল্টার করা ভিউ। এর জন্য একটি দ্রুত সমাধান হ'ল এই কোডটি অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল ফাইলটিতে যুক্ত করা:

<manifest ... >
    <!-- This attribute is "false" by default on apps targeting Android Q. -->
    <application android:requestLegacyExternalStorage="true" ... >
     ...
    </application>
</manifest>

আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন: https://developer.android.com/training/data-stores/compatibility


@ বিলি আমি লক্ষ্য করেছি এটি কেবল এপিআই ২৯-এর ডিভাইসগুলিতেই ঘটে থাকে So সুতরাং আমি ফাইল সরবরাহকারীর পরিবর্তনের সন্ধান করেছি
ইউরিয়েল ফ্রাঙ্কেল

অবশেষে এই লাইনের সাথে কাজ করার জন্য ক্লাউডেস্টিংসস্ক্রিন্টার_লিব.আর পেয়েছে অ্যান্ড্রয়েড টেস্ট ম্যানিফেস্টে যুক্ত, এই সন্ধানের জন্য আপনাকে অনেক ধন্যবাদ।
bko

6
আপনি স্যার, আমাকে অনেক সময় বাঁচিয়েছিলেন। কিউ এর বিকাশকারীদের জন্য প্রচুর জিনিস ব্যথা হয়ে উঠেছে I আমি মনে করি এই উত্তরটি একটি পৃথক প্রশ্ন হিসাবে পোস্ট করা উচিত এবং আরও উত্সাহের দাবিদার।
সঞ্জীব

আমি এই সুন্দর ছোট কালো যাদু কৌশল সম্পর্কে আরও পড়তে চাই, তবে দুর্ভাগ্যক্রমে লিঙ্কটি একটি 404 ত্রুটি
ফেরায়

ওহ, আমি উত্তরটি সম্পাদনা করব
উরিয়েল ফ্রাঙ্কেল

58

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


51

সমস্ত উত্তর ছাড়াও, আপনি আপনার ফোনটি একটি USB স্টোরেজ হিসাবে ব্যবহার করছেন না তা নিশ্চিত করুন।

ইউএসবি স্টোরেজ মোড সক্ষম করে এইচটিসি সেনসেশন করার ক্ষেত্রেও আমার একই সমস্যা ছিল। আমি এখনও অ্যাপটি ডিবাগ / চালাতে পারি, তবে আমি বাহ্যিক স্টোরেজে সংরক্ষণ করতে পারি না।


ধন্যবাদ মানুষ, যদিও আমি রানটাইম ব্যবহারকারীর কাছ থেকে অনুমতি চেয়েছিলাম। এমুলেটরটিতে এই ত্রুটি ঘটেছে।
ধারালো প্রান্ত

1
আমি যখন স্যামসাং গ্যালাক্সি এস 6 ডিভাইসটি সংযুক্ত করি তখন এটি প্রথমে "ডেনি" বা "সমস্ত" এর সাথে "ডিভাইসের ডেটাতে অ্যাক্সেসের অনুমতি দিন" এবং নোটিফিকেশন বার থেকে একটি বিকল্প দেয় আমি 1 এমটিপি ২. পিটিপি ৩. এমডিআইয়ের জন্য ইউএসবি ব্যবহার করব option ডিভাইসগুলি 4. চার্জ করা হচ্ছে। কোনটি বেছে নেবে?
টেস্টিং

34

যোগ অ্যান্ড্রয়েড requestLegacyExternalStorage = "সত্য" Android এর ম্যানিফেস্ট এটা এর Android 10 SDK এর দিকে (প্রশ্ন) 29+ সঙ্গে কাজ
বা মাইগ্রেট করার পর অ্যান্ড্রয়েড X

 <application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:hardwareAccelerated="true"
    android:icon=""
    android:label=""
    android:largeHeap="true"
    android:supportsRtl=""
    android:theme=""
    android:requestLegacyExternalStorage="true">

এটা কাজ করেছে. অনেক ধন্যবাদ.
প্রশংসনাক্বয়007

বাহ পুরোপুরি কাজ করে, এটাই ছিল আমি যে উত্তরটি চেয়েছিলাম, দুর্দান্ত, আপনাকে ধন্যবাদ @ রাহালদার, আপনি আমার দিনটি বাঁচিয়েছিলেন
আয়ুশ কাটুওয়াল

29

আমার সমস্যাটি "টার্গেটএপি (23)" এর সাথে ছিল যা আপনার মিনিএসডিপি ভার্সনটি 23 টি বেলো করা দরকার।

সুতরাং, নিম্নলিখিত স্নিপেটের সাথে আমার কাছে অনুমতিের অনুরোধ রয়েছে

protected boolean shouldAskPermissions() {
    return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
}

@TargetApi(23)
protected void askPermissions() {
    String[] permissions = {
            "android.permission.READ_EXTERNAL_STORAGE",
            "android.permission.WRITE_EXTERNAL_STORAGE"
    };
    int requestCode = 200;
    requestPermissions(permissions, requestCode);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
// ...
    if (shouldAskPermissions()) {
        askPermissions();
    }
}

28

Android Q এর সমাধান :

<application ...
    android:requestLegacyExternalStorage="true" ... >

তুমি আমার দিন বাঁচিয়েছ অনুমতি দেওয়া হয়েছে তবে আমি এটি সেট না করা পর্যন্ত গ্লাইড চিত্রগুলি পড়তে পারে না।
leegor

সাবধান: অ্যান্ড্রয়েড 11 সম্পূর্ণরূপে উত্তরাধিকার এক্সেস আগস্ট 2020, তাই ভাল আপগ্রেড ফাইল অ্যাক্সেস আপনার অ্যাপসের জন্য সংগ্রহস্থল অ্যাক্সেস ফ্রেমওয়ার্ক (সাফ) ব্যবহার করতে সরাবে
dimib

16

আমি একই অভিজ্ঞতা। আমি যা পেয়েছি তা হ'ল আপনি যদি সেটিংস -> অ্যাপ্লিকেশন ম্যানেজার -> আপনার অ্যাপ -> অনুমতিসমূহ -> স্টোরেজ সক্ষম করেন তবে এটি সমস্যা সমাধান করে।


1
আমি এই বিভাগটি খুঁজে পাচ্ছি না?
ইভান সেভি

13

দেখা গেল, আমার ফোনটি এখনও ডেস্কটপ পিসির সাথে সংযুক্ত করেছিলাম এবং এটি উপলব্ধি করতে পারি নি এটি একটি বোকামি ভুল।

সুতরাং আমাকে ইউএসবি সংযোগটি বন্ধ করতে হয়েছিল এবং সবকিছু ঠিকঠাক কাজ করেছিল।


আমার জন্যও কাজ করেছেন। তবে কেন এটি কাজ করে? কি পার্থক্য পিসি করতে ইউএসবি সংযোগ না।
ব্যবহারকারী 13107

ভাল প্রশ্ন. আমি এর আগে আর কখনও তদন্ত করিনি। আমি অনুমান করব যে মুহূর্তে আপনি ডিভাইসটি সংযুক্ত করবেন সেই মুহুর্তে সিস্টেমের একটি রাইটিং লক রয়েছে (যাতে এটি আপনার কম্পিউটারে কোনও ইউএসবি ডিভাইস অনুকরণ করতে পারে)। অসম্পূর্ণ তথ্য এড়ানোর জন্য এটি হতে পারে। যদিও নিশ্চিত না।
টোবিয়াস রিখ

আমি এখানে কারণ খুঁজে পাওয়া যায় নি stackoverflow.com/questions/7396757/... আমার উত্তর দেখার stackoverflow.com/a/43863548/1729501
user13107

13

সিএম 12.1 চালানো স্যামসাং গ্যালাক্সি নোট 3 এ আমারও একই সমস্যা ছিল। আমার জন্য বিষয়টি আমার ছিল

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="18"/>

এবং ব্যবহারকারীর ফটোগুলি নিতে এবং সঞ্চয় করতে এটি ব্যবহার করতে হয়েছিল। আমি যখন একই ছবি ফটোগুলি লোডারে লোড করার চেষ্টা করেছি তখন (Permission denied)ত্রুটি পেয়েছি । সমাধানটি ছিল স্পষ্টভাবে যুক্ত করা

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

যেহেতু উপরের অনুমতিটি কেবল এপিআই সংস্করণ 18 পর্যন্ত লেখার অনুমতি সীমাবদ্ধ করে এবং এর সাথে পড়ার অনুমতি দেয়।


আমাকে সাহায্য করেনি! একটি চেষ্টা মূল্য! ধন্যবাদ।
সাকিবয়

9

সমস্ত উত্তরের পাশাপাশি, ক্লায়েন্টগুলি অ্যান্ড্রয়েড .0.০ ব্যবহার করে থাকলে, অ্যান্ড্রয়েড (মার্শমেলো) এর জন্য নতুন অনুমতি মডেল যুক্ত করেছে।

কৌশল: আপনি যদি 22 বা নীচের সংস্করণটিকে লক্ষ্য করে দেখছেন তবে আপনার অ্যাপ্লিকেশনটি মার্শমেলোর নীচে কোনও OS চালিত কোনও ডিভাইসে যেমন ইনস্টল করার সময় সমস্ত অনুমতিগুলির জন্য অনুরোধ করবে। আপনি যদি এমুলেটরটিতে চেষ্টা করছেন তবে অ্যান্ড্রয়েড .0.০ থেকে আপনার স্পষ্টতই সেটিংস-> অ্যাপ্লিকেশন-> ইয়োরআরএপিপি -> অনুমতিগুলি যেতে হবে এবং আপনি যদি কিছু দিয়েছেন তবে অনুমতি পরিবর্তন করতে হবে।


2
অবিশ্বাস্য, আমি এটি বের করার চেষ্টা করে 2 দিন অতিবাহিত করেছি। যতবারই অনুভব করি অ্যান্ড্রয়েডে জিনিসগুলি সহজেই চলছে, এরকম কিছু ঘটে।
জাইমে ইভান সার্ভেন্টস

7

আশ্চর্যজনকভাবে আমার নতুন ফাইলটি আমার সমস্যার সমাধান হওয়ার আগে "/" স্ল্যাশ দেওয়ার পরে । আমি এটি পরিবর্তন করেছি:

File myFile= new File(Environment.getExternalStorageDirectory() + "newFile");

এটি:

File myFile= new File(Environment.getExternalStorageDirectory() + "/newFile");

1
এখানে অদ্ভুত কিছু না। প্রথম লাইনটি দিয়ে আপনি একই ডিরেক্টরিতে একটি ফাইল তৈরি করার চেষ্টা করছেন যা আপনার বাহ্যিক স্টোরেজ ডিরেক্টরিটি অন্তর্ভুক্ত করে। ie / স্টোরেজ..... / / স্টোরেজের পরিবর্তে কিছু / কিছু ফাইল /...
স্টাফেন

@ স্টাফেন উত্তরগুলির বিস্তৃত পরিসরটি দেখলে ত্রুটিটি নিজেই অদ্ভুত।
দারুশ

3
এটি করার সঠিক উপায় হ'ল ফাইল (দির, ফাইল) ক্যাসেন্ট্রাক্টর
নিক কার্ডোসো

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

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

6

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

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


2
হাহাকার, আমি প্রায় 3 ঘন্টা কাজ প্রায় সময় কাটিয়েছি। অ্যাডিশনালি, আমাকে ডিভাইসটি রিবুট করতে হয়েছিল এবং এটি কার্যকর হয়েছিল। আপনাকে অনেক ধন্যবাদ
ক্রগারিডোস

5

আমি নীচের সমস্ত কিছু /data"অভ্যন্তরীণ স্টোরেজ" এর অন্তর্গত বলে আশা করব । আপনার অবশ্য লিখতে সক্ষম হওয়া উচিত /sdcard


5
আমি <ব্যবহার-অনুমতি অ্যান্ড্রয়েড: নাম = "android.permission.WRITE_INTERNAL_STORAGE" /> চেষ্টা করেছিলাম। এখনো একই.
Mert

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

5

আপনার /system/etc/permission/platform.xml
এবং গোষ্ঠীতে একটি অনুমতি সম্পত্তি পরিবর্তন করুন নীচের মত উল্লেখ করা প্রয়োজন।

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
    <group android:gid="sdcard_rw" />
    <group android:gid="media_rw" />    
</uses-permission>

প্ল্যাটফর্ম.এক্সএমএল ঠিক তখনই লক হয়ে গেছে, এটি অ্যাডবি শেলের মাধ্যমে চেষ্টা করে তবে এডিবি আমাকে মোডের জন্য ব্যবহার করতে দেবে না কেন এটি স্ক্রিপ্টের প্রয়োজন।
জন

ব্যর্থ হয়। আমার ডিভাইসটিকে বুট লুপে রাখুন।
তোবসে

5

গ্যালাক্সি এস 5 (অ্যান্ড্রয়েড 6.0.1) এ ডিসিআইএম / ক্যামেরা ফোল্ডারে কোনও চিত্র লেখার চেষ্টা করার সময় আমার একই ত্রুটি হয়েছিল এবং আমি বুঝতে পেরেছিলাম যে কেবল এই ফোল্ডারটিই সীমাবদ্ধ নয়। আমি কেবল ডিসিআইএম / যে কোনও ফোল্ডারে লিখতে পারি তবে ক্যামেরায় না। এটি ব্র্যান্ড ভিত্তিক সীমাবদ্ধতা / কাস্টমাইজেশন হওয়া উচিত।


4

যখন আপনার অ্যাপ্লিকেশনটি সিস্টেম অ্যাপ্লিকেশনটির সাথে সম্পর্কিত তখন এটি এসডি কার্ড অ্যাক্সেস করতে পারে না।


4

আপনি যদি ম্যানিফেস্টে সমস্ত সঠিক অনুমতি সেট করে থাকেন তাও মনে রাখবেন: আপনার বাহ্যিক কার্ডে কেবলমাত্র তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলিকেই লেখার অনুমতি দেওয়া হ'ল "তাদের নিজস্ব ডিরেক্টরিগুলি" (যেমন / এসডিকার্ড / অ্যান্ড্রয়েড / ডেটা /) লেখার চেষ্টা করছে অন্য কোথাও: আপনি ব্যতিক্রম পাবেন: EACCES (অনুমতি অস্বীকার)


3

হয়তো উত্তরটি হ'ল:

এপিআই> = ২৩ ডিভাইসে, আপনি যদি অ্যাপ্লিকেশন ইনস্টল করেন (অ্যাপটি সিস্টেম অ্যাপ নয়) আপনার "সেটিং - অ্যাপ্লিকেশনগুলিতে" স্টোরেজ অনুমতিটি পরীক্ষা করা উচিত, প্রতিটি অ্যাপ্লিকেশনের অনুমতি তালিকা রয়েছে, আপনার এটি পরীক্ষা করা উচিত! চেষ্টা


3

আমার ক্ষেত্রে আমি একটি ফাইল চয়নকারী লাইব্রেরি ব্যবহার করছিলাম যা বাহ্যিক স্টোরেজের পথে ফিরে এসেছিল তবে এটি থেকে শুরু হয়েছিল /root/। এমনকি রানটাইমের সময় অনুমোদিত WRITE_EXTERNAL_STORAGE অনুমোদনের পরেও আমি ত্রুটি EACCES পেয়েছি (অনুমতি অস্বীকৃত)
সুতরাং Environment.getExternalStorageDirectory()বাহ্যিক স্টোরেজ সঠিক পথ পেতে ব্যবহার করুন ।

উদাহরণ:
লিখতে পারছেন না: /root/storage/emulated/0/newfile.txt
লিখতে পারেন: /storage/emulated/0/newfile.txt

boolean externalStorageWritable = isExternalStorageWritable();
File file = new File(filePath);
boolean canWrite = file.canWrite();
boolean isFile = file.isFile();
long usableSpace = file.getUsableSpace();

Log.d(TAG, "externalStorageWritable: " + externalStorageWritable);
Log.d(TAG, "filePath: " + filePath);
Log.d(TAG, "canWrite: " + canWrite);
Log.d(TAG, "isFile: " + isFile);
Log.d(TAG, "usableSpace: " + usableSpace);

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

আউটপুট 1:

externalStorageWritable: true
filePath: /root/storage/emulated/0/newfile.txt
isFile: false
usableSpace: 0

আউটপুট 2:

externalStorageWritable: true
filePath: /storage/emulated/0/newfile.txt
isFile: true
usableSpace: 1331007488

আমারও ঠিক একই সমস্যা ছিল। সরানো হচ্ছে rootপথ থেকে অংশ আমার সমস্যা সমাধান।
xabush

3
Environment.getExternalStoragePublicDirectory();

অ্যান্ড্রয়েড 29 থেকে এই অবহেলা পদ্ধতিটি ব্যবহার করার পরে আপনি একই ত্রুটি পাবেন:

java.io.FileNotFoundException: open failed: EACCES (Permission denied)

রেজোলিউশন এখানে:

getExternStoragePublicDirectory অ্যান্ড্রয়েড কিউতে অবমূল্যায়ন করা হয়েছে


3

অনুসন্ধান ফলাফল থেকে এখানে আসা এবং অ্যান্ড্রয়েড 10 কে লক্ষ্য করছে এমন যে কেউ জন্য: অ্যান্ড্রয়েড 10 (এপিআই 29) স্টোরেজ সম্পর্কিত কিছু অনুমতি পরিবর্তন করে।

আমি আমার পূর্ববর্তী দৃষ্টান্তগুলি Environment.getExternalStorageDirectory()(যা এপিআই 29 এর সাথে অবজ্ঞা করা হয়) এর সাথে প্রতিস্থাপন করার সময় আমি সমস্যাটি সমাধান করেছি context.getExternalFilesDir(null)

নোট যে context.getExternalFilesDir(type)স্টোরেজ অবস্থান উপলব্ধ না হলে বাতিল করতে পারে, সুতরাং আপনি যখনই বাহ্যিক অনুমতি আছে কিনা তা পরীক্ষা করে দেখতে নিশ্চিত হন।

এখানে আরও পড়ুন ।


2

আমি আমার init.rc এ / ডেটা / এর অধীনে একটি ফোল্ডার তৈরি করছি (নেক্সাস on-এ অ্যাওসপটি নিয়ে ঘুরে বেড়াচ্ছি) এবং ঠিক এই সমস্যা ছিল।

দেখা গেল যে ফোল্ডারটি rw (6 666) অনুমতি দেওয়ার পক্ষে যথেষ্ট ছিল না এবং এটি rwx (7 777) করতে হয়েছিল তখন এটি সমস্ত কাজ করেছিল!


2

এই Adb কমান্ডগুলির মাধ্যমে আপনার কাছে যদি কোনও শিকড় ডিভাইস থাকে তবে স্টোরেজ অনুমতিগুলির 6.0 পোস্ট পোস্ট করা যায় না:

root@msm8996:/ # getenforce
getenforce
Enforcing
root@msm8996:/ # setenforce 0
setenforce 0
root@msm8996:/ # getenforce
getenforce
Permissive

1

ম্যানিফেস্টে অনুমতি যুক্ত করুন।

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

3
কোনও অনুমতি নেইandroid.permission.READ_INTERNAL_STORAGE
রায়ান আর

0

আমার একই সমস্যা ছিল (এপিআই> = 23)।

Https://stackoverflow.com/a/13569364/1729501 সমাধানটি আমার পক্ষে কাজ করেছিল, তবে ডিবাগিংয়ের জন্য অ্যাপ সংযোগ বিচ্ছিন্ন করা ব্যবহারিক ছিল না।

আমার সমাধানটি ছিল উইন্ডোজে যথাযথ অ্যাডবি ডিভাইস ড্রাইভার ইনস্টল করা। গুগল ইউএসবি ড্রাইভার আমার ডিভাইসের জন্য কাজ করে নি।

পদক্ষেপ 1: আপনার ডিভাইস ব্র্যান্ডের জন্য অ্যাডবি ড্রাইভারগুলি ডাউনলোড করুন।

পদক্ষেপ 2: ডিভাইস পরিচালক -> অন্যান্য ডিভাইসগুলিতে যান -> "অ্যাডাব" শব্দের সাথে প্রবেশের সন্ধান করুন -> ড্রাইভার আপডেট করুন নির্বাচন করুন -> পদক্ষেপ 1 এ অবস্থান দিন


0

অনুমতি যোগ করার পরে আমার সমস্যার সমাধান হয়েছে

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

0

গ্রেড নির্ভরতা যুক্ত করুন

implementation 'com.karumi:dexter:4.2.0'

আপনার মূল ক্রিয়াকলাপের নীচে কোড যুক্ত করুন।

import com.karumi.dexter.Dexter;
import com.karumi.dexter.MultiplePermissionsReport;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;
    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {


                checkMermission();
            }
        }, 4000);
    }

    private void checkMermission(){
        Dexter.withActivity(this)
                .withPermissions(
                        android.Manifest.permission.READ_EXTERNAL_STORAGE,
                        android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        android.Manifest.permission.ACCESS_NETWORK_STATE,
                        Manifest.permission.INTERNET
                ).withListener(new MultiplePermissionsListener() {
            @Override
            public void onPermissionsChecked(MultiplePermissionsReport report) {
                if (report.isAnyPermissionPermanentlyDenied()){
                    checkMermission();
                } else if (report.areAllPermissionsGranted()){
                    // copy some things
                } else {
                    checkMermission();
                }

            }
            @Override
            public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
                token.continuePermissionRequest();
            }
        }).check();
    }

0

আমার ক্ষেত্রে ত্রুটিটি লাইনে উপস্থিত হয়েছিল

      target.createNewFile();

যেহেতু আমি এসডি কার্ডে একটি নতুন ফাইল তৈরি করতে পারিনি, তাই আমাকে ডকুমেন্টফিল পদ্ধতির ব্যবহার করতে হয়েছিল।

      documentFile.createFile(mime, target.getName());

উপরের প্রশ্নের জন্য এই পদ্ধতির মাধ্যমে সমস্যার সমাধান হতে পারে,

    fos=context.getContentResolver().openOutputStream(documentFile.getUri());

এই থ্রেডটিও দেখুন, অ্যান্ড্রয়েড 5.0 (ললিপপ) এর জন্য উপস্থাপিত নতুন এসডি কার্ড অ্যাক্সেস এপিআই কীভাবে ব্যবহার করবেন?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.