बिटमैप का आकार केवल 49 केबी है।

मेरे पास मेरे AndroidManifest में अनुमतियां हैं:

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

लेकिन निम्न कोड शून्य लौटाता है, यह फ़ाइल से छवि को नहीं पढ़ सकता है।

Im = BitmapFactory.decodeFile(file.absolutePath) // <== file: "/storage/emulated/0/Android/data/com.example.App1/files/MyImages/MyImg.png"

BitmapFactory.decodeFile शून्य लौटाता है।

मैंने फाइलस्ट्रीम के साथ सुझावों की खोज की और कोशिश की:

try {
    val dest = File(fullPath, fileName)  // dest: "/storage/emulated/0/Android/data/com.example.App1/files/MyImages/MyImage.png"
    var fis: FileInputStream
    fis = FileInputStream(dest)      // <= Jumps to catch section from this line
    Img = BitmapFactory.decodeStream(fis)
}
catch (e: Exception) {
    Log.e("File could not be found", e.message)    
}
return Img 

लेकिन, जब मैं इसे डीबग करता हूं तो कर्सर fis = FileInputStream(dest) लाइन से कैच सेक्शन में कूद जाता है। यह यह त्रुटि देता है:

e=java.io.FileNotFoundException (No such file or directory)

जब मैं इस कोशिश-पकड़ ब्लॉक को "if" स्टेटमेंट में इस तरह डालता हूं;

val file = File(fullPath, fileName)
if (file.exists()){
      // the above try-catch block is here
 }

तब स्थिति "file.exists()" नहीं सत्य है (लेकिन मैं डिवाइस में देख सकता हूं, फ़ाइल मौजूद है। यह अंदर है वही पथ "dest" पैरामीटर के साथ लिया गया है, जिसका मान ऊपर दिया गया है जैसा कि आप देखते हैं)

मैंने पीएनजी फ़ाइल को बिटमैप को android गैलरी में कैसे सेव करें पर कोड के साथ सहेजा है। a> बाओ लेई द्वारा दिया गया। वे कोड नीचे हैं:

/// @param folderName can be your app's name
    private fun saveImage(bitmap: Bitmap, context: Context, folderName: String) {
        if (android.os.Build.VERSION.SDK_INT >= 29) {
            val values = contentValues()
            values.put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/" + folderName)
            values.put(MediaStore.Images.Media.IS_PENDING, true)
            // RELATIVE_PATH and IS_PENDING are introduced in API 29.

            val uri: Uri? = context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
            if (uri != null) {
                saveImageToStream(bitmap, context.contentResolver.openOutputStream(uri))
                values.put(MediaStore.Images.Media.IS_PENDING, false)
                context.contentResolver.update(uri, values, null, null)
            }
        } else {
            val directory = File(Environment.getExternalStorageDirectory().toString() + separator + folderName)
            // getExternalStorageDirectory is deprecated in API 29

            if (!directory.exists()) {
                directory.mkdirs()
            }
            val fileName = System.currentTimeMillis().toString() + ".png"
            val file = File(directory, fileName)
            saveImageToStream(bitmap, FileOutputStream(file))
            if (file.absolutePath != null) {
                val values = contentValues()
                values.put(MediaStore.Images.Media.RELATIVE_PATH, folderName)
                // .DATA is deprecated in API 29
                context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
            }
        }
    }

    private fun contentValues() : ContentValues {
        val values = ContentValues()
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/png")
        values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
        values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
        return values
    }

    private fun saveImageToStream(bitmap: Bitmap, outputStream: OutputStream?) {
        if (outputStream != null) {
            try {
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
                outputStream.close()
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }

अगर बयान; अगर (android.os.Build.VERSION.SDK_INT >= 29) नहीं सच है। इसलिए, केवल शेष अन्य अनुभाग चल रहा है। इस else अनुभाग में, मैंने यह कोड हटा दिया है;

    if (file.absolutePath != null) {
        val values = contentValues()
        values.put(MediaStore.Images.Media.DATA, file.absolutePath)
        // .DATA is deprecated in API 29
        context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
    }

क्योंकि, यह इस त्रुटि का कारण बनता है:

Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=14668, uid=10271 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()

तो, उपरोक्त कोड में फ़ंक्शन saveImageToStream छवि को सहेजता है।

अब, पीएनजी पढ़ने में समस्या है

 e=java.io.FileNotFoundException (No such file or directory)

हालांकि पीएनजी मौजूद है। इस समस्या को हल कैसे करें ?

कोड fis = FileInputStream(dest) didtodayActivity.kt फ़ाइल में है। और, इस गतिविधि फ़ाइल को मेनिफेस्ट फ़ाइल में परिभाषित किया गया है;

<activity android:name=".DidtodayActivity">
    <intent-filter>
        <action android:name="com.mystudio.otherlab.MainActivity" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity android:name=".secondActivity" />
<activity android:name=".loginActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

क्या मेनिफेस्ट फ़ाइल में कोई समस्या है?

पथ सही होने और पीएनजी फ़ाइल मौजूद होने के बावजूद त्रुटि (फ़ाइल नहीं मिली) क्यों होती है? मुझे आशा है कि कोई मदद कर सकता है

0
Member 25 फरवरी 2020, 23:19
टिप्पणियाँ विस्तृत चर्चा के लिए नहीं हैं; इस बातचीत को पर ले जाया गया है चैट.
 – 
Samuel Liew
26 फरवरी 2020, 17:04
तो, पथ सही है। फ़ाइल मौजूद है। त्रुटि (फ़ाइल नहीं मिल सकी) क्यों होती है?
 – 
Member
26 फरवरी 2020, 17:07

1 उत्तर

यह आपको क्या देता है

try {
   // Img = BitmapFactory.decodeFile(file.absolutePath) //<= returns null

    val dest = File(fullPath, fileName)  // dest: "/storage/emulated/0/Android/data/com.example.App1/files/MyImages/MyImage.png"

    System.out.println("DEST IS: " + dest);  // <= Check this in Logcat

    var fis: FileInputStream
    fis = FileInputStream(dest)      // <= Jumps to catch section from this line
    Img = BitmapFactory.decodeStream(fis)
}
catch (e: Exception) {
    Log.e("File could be find", e.message)    
}

0
Syorito Hatsuki 25 फरवरी 2020, 23:26
यह इस लाइन से सेक्शन को पकड़ने के लिए कूदता है ==> fis = FileInputStream (dest)। धन्यवाद, ई.संदेश में "नहीं" शामिल होना चाहिए (मैंने प्रश्न संपादित किया)। इस समस्या को हल कैसे करें?
 – 
Member
25 फरवरी 2020, 23:41