ไม่สามารถอ่านไฟล์รูปภาพจากโฟลเดอร์ Assets และแชร์โดยใช้ Intent ใน Android ได้

ทำตามบทช่วยสอนนี้เพื่ออ่านรูปภาพจากโฟลเดอร์เนื้อหา นี่คือลิงค์ ลิงก์สำหรับอ่านรูปภาพจากโฟลเดอร์ Assets Contentclass ขยายจาก ContentProvider แต่ฉันได้รับข้อผิดพลาดในบรรทัดแรก ข้อผิดพลาดนี้อยู่ในบรรทัดแรกสุด Contentclass1 Line โปรดแจ้งให้เราทราบว่าฉันต้องดำเนินการอะไรบ้างใน Contentclass1 .java

Multiple markers at this line
    - The type Contentclass1 must implement the inherited abstract method ContentProvider.onCreate()
    - The type Contentclass1 must implement the inherited abstract method ContentProvider.delete(Uri, String, String[])
    - The type Contentclass1 must implement the inherited abstract method ContentProvider.query(Uri, String[], String, String[], 
     String)
    - The type Contentclass1 must implement the inherited abstract method ContentProvider.getType(Uri)
    - The type Contentclass1 must implement the inherited abstract method ContentProvider.update(Uri, ContentValues, String, 
     String[])
    - The type Contentclass1 must implement the inherited abstract method ContentProvider.insert(Uri, ContentValues)

Contentclass1.java

package com.example.shareima;
import java.io.FileNotFoundException;
import java.io.IOException;
import android.content.ContentProvider;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.net.Uri;

public class Contentclass1 extends ContentProvider
{
    @Override
    public AssetFileDescriptor openAssetFile(Uri uri,String mode) throws FileNotFoundException {
        AssetManager am = getContext().getAssets();
        String file_name = uri.getLastPathSegment();
        if(file_name == null) 
            throw new FileNotFoundException();
        AssetFileDescriptor afd = null;
        try {
            afd = am.openFd(file_name);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return afd;//super.openAssetFile(uri, mode);
    }
}

Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.shareima"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="12"
        android:targetSdkVersion="17" />
 <uses-permission android:name="android.permission.INTERNET"/>
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
 <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.shareima.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
         <provider android:name=".Contentclass1"               
            android:authorities="com.example.shareima"/>
 </application>
 </manifest>

person user3233280    schedule 27.01.2014    source แหล่งที่มา


คำตอบ (1)


ContentProvider เป็นคลาสนามธรรม นั่นหมายความว่ามีคำจำกัดความสำหรับวิธีการบางอย่างแต่ไม่ได้จัดให้มีการนำไปปฏิบัติ ดังนั้นเมื่อคุณขยาย ContentProvider คุณจะต้องจัดเตรียมการใช้งานเมธอดเหล่านี้ในคลาสของคุณ (แม้ว่าคุณจะไม่มีความตั้งใจที่จะเรียกเมธอดเหล่านี้ในโค้ดของคุณก็ตาม) นี่คือความหมายของบทช่วยสอนเมื่อมีข้อความว่า "ใช้ stubs สำหรับวิธีนามธรรมที่จำเป็น" และรวมถึงสิ่งที่ข้อผิดพลาดในการคอมไพล์ของคุณอ้างถึงด้วย

คุณสามารถนำไปใช้ได้โดยเพิ่มสิ่งต่อไปนี้ในชั้นเรียนของคุณ:

@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
    return 0;
}

@Override
public String getType(Uri arg0) {
    return null;
}

@Override
public Uri insert(Uri arg0, ContentValues arg1) {
    return null;
}

@Override
public boolean onCreate() {
    return false;
}

@Override
public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3, String arg4) {
    return null;
}

@Override
public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
    return 0;
}

สิ่งเหล่านี้เรียกว่า 'stubs' เนื่องจากไม่ได้ทำการประมวลผลใดๆ เช่นนี้ (นอกเหนือจากการส่งคืนค่า null/ศูนย์/false)

person NigelK    schedule 27.01.2014
comment
เนื้อหาใน LOC ของบทช่วยสอนนี้คืออะไร Uri theUri = Uri.parse(content://com.yourdomain.whatever/someFileInAssetsFolder); - person user3233280; 27.01.2014
comment
ไม่ว่าบทช่วยสอนจะมี 'com.yourdomain.whatever' ให้เปลี่ยนเป็นชื่อแพ็คเกจของคุณซึ่งฉันเชื่อว่าเป็น 'com.example.shareima' ในกรณีของคุณ จากนั้นแทนที่ 'someFileInAssetsFolder' ด้วยชื่อไฟล์ที่คุณต้องการแชร์ (ที่คุณได้เพิ่มลงใน Assets ในโปรเจ็กต์ของคุณ) บางอย่างเช่น: Uri.parse(content://com.example.shareima/myfile.txt) - person NigelK; 27.01.2014
comment
คุณช่วยบอกฉันได้ไหมว่าปัญหาคืออะไรในบทช่วยสอนปัจจุบัน มันเป็นเพียงการแชร์รูปภาพผ่าน Gmail ในขณะที่ไม่สามารถแชร์ใน FB, Bluetooth ฯลฯ - person user3233280; 27.01.2014
comment
ตั้งค่าตัวเลือกใน Intent: Intent.createChooser(theIntent, ...share to); ซึ่งควรอนุญาตให้ผู้ใช้เลือกจากแอพที่ติดตั้งทั้งหมดที่สามารถประมวลผลไฟล์ที่แชร์ได้ - person NigelK; 27.01.2014
comment
ใช่ ฉันทำแบบเดียวกันและเปิดแอปทั้งหมดด้วย แต่ในกรณีของบลูทูธ ฉันได้รับข้อความ ไม่ได้ส่งไฟล์และคล้ายกันใน FB ในขณะที่ส่งจากแอป Gmail ได้สำเร็จ - person user3233280; 27.01.2014
comment
ฉันเสียใจที่ฉันไม่ทราบเหตุผลสำหรับสิ่งนั้น ฉันขอแนะนำให้ถามคำถามใหม่สำหรับปัญหาใหม่ที่คุณกำลังเผชิญอยู่ - person NigelK; 27.01.2014