2011-06-21 30 views
6

現在、広告で無料で公開されているカジュアルなアプリの有料広告無料版を公開しようとしています。私たちはすべてのパッケージ名をcom.mycompanyname.appname.proにリファクタリングしました。市場に出ている無料のものには基本的に.proがありません。また、コンテンツプロバイダに入り、パッケージ名と同じ権限に変更しました。だから、「無料版」Androidデュプリケートのプロバイダ権限の問題

AUTHORITY = "com.mycompanyname.appname" 

を持っており、「広告のない有料版は

AUTHORITY = "com.mycompanyname.appname.pro" 

を持っていますが、まだ我々は無料で、両方インストールすることはできません 『と同じデバイス上のプロ』版を

私たちはapkから直接インストールすることはできません。アンドロイドマーケットからダウンロードしようとすると、「複製プロバイダ権限」が取得されます。エラーメッセージ。

私たちは何が欠けていますか?問題を探すために必要な別の場所があるのか​​、ここに根本的に何か問題があるのでしょうか?

答えて

0

同じ問題が発生し、プロバイダ名が既に登録されているというエラーメッセージが表示されました。私はこのトリックが別の権限と異なる名前の両方を使うことになると思っていました。私の場合は、ベースプロビジョナルをフリーとプロの両方のライブラリプロジェクトから拡張しました。あなたがまだそれを持っているなら、これはあなたの問題を解決します(これは古い投稿であることに気付きましたが、答えがないので、私はそれをどうにかして投稿することに決めました)。

他の誰かが同じことをしているのであれば、私は興味がありました。確かにそれはAndroidプラットフォームのバグであるようです。問題の詳細hereまたは同様のSO投稿hereを参照してください。

2

基本的には、各ContentProviderの抽象基本クラスを作成し、権限パスをオーバーライドする各アプリケーションの継承から継承します。だから私のAbstractContentProviderに私が持っている:

public AbstractContentProvider() { 
    sURIMatcher.addURI(getAuthority(), BASE_PATH, ITEMS); 
    sURIMatcher.addURI(getAuthority(), BASE_PATH + "/#", ITEM_ID); 
} 

protected abstract String getAuthority(); 

をして、私が持っている各サブクラスで:AndroidManifestで

private static final String AUTHORITY = "my.package.app1.ContentProvider"; 

@Override 
protected String getAuthority() { 
    return AUTHORITY; 
} 

私はこれらを登録します。

<provider 
      android:name="my.package.app1.ContentProvider" 
      android:authorities="my.package.app1.ContentProvider"> 
    </provider> 

を今トリックは、私ですこれらのコンテンツプロバイダに、アプリケーション固有のクラスについて知らない共通(ライブラリ)コードでアクセスしたいと考えています。これを行うために、私はstrings.xml内のStringを定義します。これは各アプリケーションに対してオーバーライドします。

Uri.parse(getString(R.string.contentProviderUri)) 

を、すべてのアプリで右のContentProviderは競合せずに使用されます。そして、私が使用することができます。基本的に依存性注入のための構成メカニズムを使用しています。

2

は、あなたの ライブラリパッケージがcom.android.app.library フリーパッケージであると言うことができますcom.android.app.free 支払ったパッケージです何もすることができ、パッケージ内の同じファイルを作成し、あなたの自由なプロジェクトと有料のプロジェクトでcom.android.app.paid

ですが、なければなりません同じ。

例:

  1. com.android.app.dataであなたの無料版で新しいパッケージを作成します

  2. 内部Authority.javaと呼ばれるファイルを作成します(Authority.java)を置きます:

    public class Authority {

    `public static final String CONTENT_AUTHORITY = "YOUR PROVIDER";` 
    

    }

  3. 有料版でこれを繰り返します。パッケージ名は同じでクラス名を忘れずに保存してください。

さて、ご契約のファイルで、あなたのライブラリーに次のように使用します。

public static String AUTHORITY = initAuthority(); 

    private static String initAuthority() { 
     String authority = "something.went.wrong.if.this.is.used"; 

     try { 

      ClassLoader loader = Contract.class.getClassLoader(); 

      Class<?> clz = loader.loadClass("com.android.app.data.Authority"); 
      Field declaredField = clz.getDeclaredField("CONTENT_AUTHORITY"); 

      authority = declaredField.get(null).toString(); 
     } catch (ClassNotFoundException e) {} 
     catch (NoSuchFieldException e) {} 
     catch (IllegalArgumentException e) { 
     } catch (IllegalAccessException e) { 
     } 

     return authority; 
    } 

    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY); 

は今、次の2つの機関を使用することができるはずです。

クレジット:イアンWarick Android - Having Provider authority in the app project

+0

Jerryl15 @私は、SAMを持っていました私は、 "com.android.app.data.Authority"またはauthority = "something.went.wrong.if.this.is.used"かどうかを明示する必要があります。 – Manoj

2

グーグルあなたは defaultConfig { pplicationId「com.example exapleアンドロイドタグの下にアプリケーションIDを定義する必要がbuild.gradleファイルにしてあなたのアプリでアプリ測定プロバイダを追加し、デフォルトで.my.app」 minSdkVersionが15 targetSdkVersion 19 versionCode 1 versionName "1.0" }

+0

これは私の問題を解決しました。 +1 – Smeet

+0

これも私の問題を解決しました。 Google Playストアにアプリをインストールすると、ユーザーにエラー505が発生していました – Jeenyus

関連する問題