2016-08-24 11 views
2

1つのアプリしかありません。コンテンツプロバイダがにエクスポートされていません(私は他のアプリケーションにコンテンツにアクセスさせたくありません)これまでコンテンツプロバイダを使用していました。同じアプリ内から呼び出されたときのコンテンツプロバイダの許可拒否

TextViewを更新するためにコンテンツオブザーバを作成しました。 onChangeメソッドは、コンテンツが変更されたときに呼び出され、そのコンテンツを再クエリしようとします。

java.lang.SecurityException:許可拒否:読書org.sil.lcroffline.data.DataProvider URIコンテンツ:それはこのようになりますセキュリティ例外を取得するときです//org.sil.lcroffline/users/ PID = 0、UID = 1000は、プロバイダをエクスポートする必要があり、またはgrantUriPermission()

からby_account_name/5555544444ここではそれを生成するコードです:

@Override 
public void onChange(boolean selfChange, Uri uri) { 
    Cursor c = null; 
    try { 
     c = mContentResolver.query(UserEntry.buildUserPhoneUri(mAccount.name), null, null, null, null); 
     // do stuff with the data in the cursor 
    } finally { 
     if (c != null) c.close(); 
    } 
} 

それが適切に形成されているようにURIが見えますが、と私はmに問題があるとは思わないコンテンツプロバイダでそれを嫌う。

上記のコードは、アプリケーション内からプログラムによって呼び出されたときに正常に機能します。例外が発生した観測データが変更された場合にのみ発生します。

同じアプリ内でどのように権限拒否を得ることができますか?これをどのように修正できますか?

見よマニフェスト:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="org.sil.lcroffline"> 

    <!-- To communicate with LCR --> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <!-- Required because we're manually creating a new account. --> 
    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/> 

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

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

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

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity 
      android:name=".authentication.LoginActivity" 
      android:label="@string/app_name" 
      android:exported="true"> 
     </activity> 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/title_activity_main" 
      android:theme="@style/AppTheme.NoActionBar" 
      android:exported="true"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".ReportActivity" 
      android:parentActivityName=".MainActivity"></activity> 
     <service android:name=".authentication.AuthenticatorService"> 
      <intent-filter> 
       <action android:name="android.accounts.AccountAuthenticator" /> 
      </intent-filter> 
      <meta-data android:name="android.accounts.AccountAuthenticator" 
       android:resource="@xml/authenticator" /> 
     </service> 
     <provider 
      android:authorities="@string/data_authority" 
      android:name=".data.DataProvider" 
      android:exported="false" /> 
     <service 
      android:name=".data.SyncService" 
      android:exported="true" 
      android:process=":sync"> 
      <intent-filter> 
       <action android:name="android.content.SyncAdapter"/> 
      </intent-filter> 
      <meta-data android:name="android.content.SyncAdapter" 
       android:resource="@xml/syncadapter" /> 
     </service> 
    </application> 

</manifest> 
+0

によってでcluedた

mUserObserver = new ContentObserver(new Handler()) { // override onChange methods here } 

は、あなたのアンドロイドOSです6.0ですか? –

+0

コンテンツプロバイダURIをエクスポートできますか? – Apurva

+0

はい、6.0.1です。コンテンツプロバイダの一部をエクスポートしないようにする必要はありません。すべてのコンテンツに他のアプリからアクセスできないようにする必要があります。 –

答えて

2

それはあなたがonChange方法が取得するコンテンツ観察者にハンドラを渡さない場合はContentObserver

Handlerを使用していない、これは私によって引き起こされる判明ハンドラを介して送信されるメッセージの代わりに直接呼び出されます。この状況でonChangeメソッドを呼び出すプロセスが、コンテンツプロバイダのクエリに必要な権限を持たないシステムOSであることを除いて、これはすべてうまくいきます。これに

mUserObserver = new ContentObserver(null) { 
    // override onChange methods here 
} 

::私は私のコンテンツオブザーバは、このから作成されたコード変更の固定これに

私はthis question

関連する問題