6

私はActiveAndroidを使用しているアプリを持っており、正常に動作しています。しかしながら;モデルをデータベースに保存しようとすると、SecurityExceptionが発生します。SecurityException:ユーザー0のプロバイダーnullを見つけることができませんでした。 Android 8.0のActiveAndroidで

スタックは次のとおりです。

Error saving model java.lang.SecurityException: Failed to find provider null for user 0; expected to find a valid ContentProvider for this authority 
at android.os.Parcel.readException(Parcel.java:1942) 
at android.os.Parcel.readException(Parcel.java:1888) 
at android.content.IContentService$Stub$Proxy.notifyChange(IContentService.java:801) 
at android.content.ContentResolver.notifyChange(ContentResolver.java:2046) 
at android.content.ContentResolver.notifyChange(ContentResolver.java:1997) 
at android.content.ContentResolver.notifyChange(ContentResolver.java:1967) 
at com.activeandroid.Model.save(Model.java:162) 
[.... local stack removed] 

は、誰がこれを経験していますか? AndroidManifest.xmlコンテンツプロバイダを指定する必要がありますか?

申し訳ありませんが、私はまだこの孤立した例はありません。私は一緒に何かを置くように働くでしょう。私はAndroidのO.上のアクティブなアンドロイドと正確に同じ問題が私のカスタムのContentProvider内のいずれかの方法がUriを返され、いくつかの時間が、それはnullを返しますと、これが原因となったことが判明した事前

+2

「を見つけることができませんでしたプロバイダのヌル "は、権限文字列が欠落しているか、文字通り' 'ヌル ''である不正な 'Uri'を示唆しています。 – CommonsWare

+0

同じクラッシュが発生しますが、スタックトレースにプロバイダとして「null」以外のものがあります。なぜこれが起きているのかわかりませんが、Android 8でのみ発生しています... – Otziii

+1

これは私を夢中にしています。ターゲットSDK 25は正常に動作し、このエラーで26+クラッシュをターゲットにしています。私はプロバイダの権限を正しく設定しています。まだこのクラッシュ。私はこれについて何も知らない。もちろん、私のウリはコールでヌルではありません!あなたは今何か新しい? – Zordid

答えて

-1

感謝問題。そこで、以下のようにメソッドに@Nullable注釈を追加し、問題を修正しました。多分理由あなたのURIの

@Nullable 
@Override 
public Uri insert(Uri uri, ContentValues contentValues) {..} 
+0

これは問題を解決しません。 –

0

アンドロイドOは、明らかにカスタムのContentProviderを使用する必要があります他のアプリケーションとデータを共有するつもりがない場合でも、データベース使用のために使用します。

https://developer.android.com/about/versions/oreo/android-8.0-changes.html

カスタムクラスはのAndroidManifest.xmlでアプリケーションタグ内のプロバイダタグで定義する必要があります。該当する場合は、exported = falseを設定して、データを外部から保護します。

<provider android:name=".MyContentProvider" 
    android:exported="false" 
    android:authorities="com.your_app_path.MyContentProvider"/> 

私にとっては、contentResolverからnotifyChangeを呼び出すために問題が発生しました。私はこれを必要としなくなったので、ContentProviderの実装を避けることができました。

2

@GeigerGeekが指摘しているように、Android 26以降のセキュリティの変更では、マニフェストにコンテンツプロバイダを指定する必要があります。

ActiveAndroidの場合は、マニフェストに以下を追加してパッケージ名を変更することができます。以上の溶液または情報について

<provider 
    android:name="com.activeandroid.content.ContentProvider" 
    android:authorities="<your.package.name>" 
    android:enabled="true" 
    android:exported="false"> 
</provider> 

これはfrom here.

0

編集マニフェストを採取し、サイド・アプリケーション・ノードでこのプロバイダタグのノードを追加しました。

<application ....> 
    <provider android:name="com.activeandroid.content.ContentProvider" 
     android:exported="false" 
     android:enabled="true" 
     android:authorities="here will be package name of your app"/> 
..... 
</application> 

私はこれを使用してエラーを修正しました。 Click here for demo

0

ログインhttps://github.com/pardom/ActiveAndroid/issues/536#issuecomment-344470558

プロジェクトがaddModelClassesの設定方法アプリケーションを介してJavaのソースコード内のモデルクラスを定義している、まだその構成によってロードする習慣が原因のモデルクラスをクラッシュされます。そのような状況では、モデル定義をAndroidManifest.xmlファイルに移動する必要があります。あなたがFileProviderで何かをやっている場合は

のAndroidManifest.xml

<provider 
    android:name=".content.DatabaseContentProvider" 
    android:authorities="your package name" 
    android:exported="false" /> 

DatabaseContentProvider.java

... 
import com.activeandroid.content.ContentProvider; 
... 

public class DatabaseContentProvider extends ContentProvider { 

@Override 
protected Configuration getConfiguration() { 
    Configuration.Builder builder = new Configuration.Builder(getContext()); 
    builder.addModelClass(SomeModel.class); 
    builder.addModelClass(OtherModel.class); 
    return builder.create(); 
}} 

、パッケージ名を変更するお見逃しなく

Uri contentUri = FileProvider.getUriForFile(mContext, 
      "your package name", new File(mImageFilePath)); 
関連する問題