วิธีแก้ไขเนื้อหาที่ไม่สามารถแสดงข้อผิดพลาดเมื่อเปิดไฟล์โดยใช้เจตนา?

ฉันต้องการแสดงไฟล์โดยใช้โปรแกรมตามเจตนาไปยังแอปอื่น เช่น โปรแกรมดู PDF แต่ไม่มีแอปใดสามารถแก้ไขเนื้อหาของไฟล์และแสดงข้อความแสดงข้อผิดพลาดหรือปิดทันที ฉันคิดว่าแอปของฉันจะไม่ส่งเนื้อหาของไฟล์อย่างถูกต้อง ดังนั้นแอปอื่นจึงไม่สามารถแสดงไฟล์ได้

ฉันค้นหาวิธีแก้ไขแล้ว แต่พบเฉพาะความคิดเห็นและโพสต์ที่ปัญหาคือการเปิดไฟล์ แต่นั่นไม่ใช่ปัญหาของฉัน

นี่คือรหัสของฉัน (ไม่ใช่ของฉันจริงๆ ฉันได้มาจากเว็บไซต์อื่น) เพื่อเปิดไฟล์:

        MimeTypeMap myMime = MimeTypeMap.getSingleton();
        Intent intent = new Intent(Intent.ACTION_VIEW);
        String mimeType = myMime.getMimeTypeFromExtension(filetype);
        if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Uri fileURI = FileProvider.getUriForFile(getContext(),
                    BuildConfig.APPLICATION_ID + ".fileprovider",file);
            intent.setDataAndType(fileURI, mimeType);

        } else {
            intent.setDataAndType(Uri.fromFile(file), mimeType);
         }
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_GRANT_READ_URI_PERMISSION);
        try {
            getContext().startActivity(intent);
        }catch (ActivityNotFoundException e){
            Toast.makeText(getContext(), "No Application found to open this type of file.", Toast.LENGTH_LONG).show();
        }

String-var 'filetype' คือนามสกุลไฟล์/ประเภทเช่น "pdf" หรือ "txt" และการได้รับประเภท mime ที่ถูกต้องก็ไม่มีปัญหา File-object 'file' คือไฟล์ของฉัน ฉันสร้างขึ้นด้วยวิธีนี้:

File openFile = new File("MY_PATH");

นอกจากนี้ยังไม่มีปัญหา

แล้วข้อผิดพลาดอยู่ที่ไหนหรือมีใครมีโค้ดที่ดีกว่านี้หรือสามารถโพสต์ลิงก์ไปยังบล็อก/stack-overflow-post ที่ดีหรืออื่น ๆ ที่เกี่ยวข้องกับหัวข้อของฉันได้ ขอขอบคุณล่วงหน้า!


person JonasPTFL    schedule 16.04.2019    source แหล่งที่มา
comment
คุณได้เพิ่มผู้ให้บริการเนื้อหาของคุณลงใน Manifest แล้วหรือยัง?   -  person Antonis Radz    schedule 16.04.2019
comment
ใช่ฉันทำ. และ [BuildConfig.APPLICATION_ID + .fileprovider] ถูกต้อง   -  person JonasPTFL    schedule 16.04.2019


คำตอบ (1)


ฉันใช้รหัสนี้เพื่อแชร์รูปภาพ หวังว่าจะช่วยได้:

    private const val IMAGE_FORMAT = "image/jpg"

  override fun shareFile(file: File) {
     if (context != null) {
        val contentUri = FileProvider.getUriForFile(context!!, FileManager.PROVIDER, file)

        val intent = Intent(Intent.ACTION_SEND)
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        intent.type = IMAGE_FORMAT
        intent.putExtra(Intent.EXTRA_STREAM, contentUri)

        startActivity(Intent.createChooser(intent, getString(R.string.share_via)))
    }
}

FileManager.PROVIDER คือผู้ให้บริการ String ในกรณีของคุณ BuildConfig.APPLICATION_ID + ".fileprovider"

person Antonis Radz    schedule 16.04.2019
comment
ขอบคุณสำหรับคำตอบ. ฉันจะลองใช้รหัสนี้และให้ข้อเสนอแนะว่าใช้งานได้หรือไม่ :D - person JonasPTFL; 16.04.2019
comment
ฉันพยายามแล้ว แต่ไม่ประสบความสำเร็จ เป็นไปได้ไหมที่ฉันสร้างวัตถุไฟล์ไม่ถูกต้อง?? - person JonasPTFL; 17.04.2019