Не удалось прочитать файл изображения из папки «Активы» и поделиться им с помощью Intent в Android?

Следуйте этому руководству, чтобы прочитать изображение из папки с ресурсами. Вот ссылка Ссылка для чтения изображения из папки Assets Contentclass расширяется от ContentProvider, но я получаю сообщение об ошибке в первой строке. Эта ошибка находится в самой первой строке Contentclass1 Line. Пожалуйста, дайте мне знать, что мне нужно реализовать в Contentclass1 .Ява

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);
    }
}

Манифест.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, вам необходимо предоставить реализации этих методов в вашем классе (даже если вы не собираетесь вызывать их в своем коде). Это то, что имеет в виду учебник, когда в нем говорится «реализовать заглушки для необходимых абстрактных методов», а также то, на что ссылаются ваши ошибки компиляции.

Вы можете реализовать их, добавив в свой класс следующее:

@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;
}

Они называются «заглушками», потому что они не выполняют никакой обработки как таковой (кроме возврата значения null/zero/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
да, я сделал то же самое, и он также открывает все приложения, но в случае Bluetooth я получаю сообщение «Файл не отправлен» и подобное в FB, в то время как он успешно отправляется из приложений Gmail. - person user3233280; 27.01.2014
comment
Я сожалею, что не знаю причины этого. Я рекомендую задать новый вопрос для этой новой проблемы, с которой вы столкнулись. - person NigelK; 27.01.2014