bugly自動アップグレードandroid 7.0システムでbuglyとtakephotoの7.0の競合問題を繰り返しダウンロード

13824 ワード

このブログはbuglyの自動アップグレードが7.0システムに適応できないことを解決した. 
bug現象:7.0以上のシステムで、buglyがappを更新した後、繰り返しダウンロードし、インストールインタフェースに入ることができない.同時に、buglyのこのbugを解決する時、takephotoの7.0に適したコードと衝突する.
一.buglyアップグレードライブラリが7.0システムに適応できない理由
7.0システムではプライベートファイルへのアクセスが強化されているため、新しいバージョンのアプリをダウンロードすると、ダウンロードしたアプリのパスを取得する権限がない可能性がありますので、繰り返しダウンロードします
二.bugly適合7.0システムの解決
複数の資料に基づいて、リストファイルに以下のコードを配置すればよい. 
<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileProvider"
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths" />
provider>
.......
application>

res/xml/providerの作成paths.xml
xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path
            name="files_root"
            path="Android/data/com/pgyersdk" />
        <external-path
            name="external_storage_root"
            path="." />
    paths>
resources>

このときすでに問題が解決するbugly問題を解決することができる.
しかし、プロジェクトにtakephotoが統合されている場合、コンパイル時にエラーが発生します.エラー情報はxmlファイルのマージに失敗し、Providerを指します. 
これはtakephotoのリストファイルにもandroid:name=「android.support.v 4.content.FileProvider」が使用されているためです. 
だから合併の失敗を報告して、いくつかのブログの中で、github takephotoのIssuesの中で提出した解決方法があります.
解決策は次のとおりです.
2.1  オフラインライブラリtakehpotoをインポートし、元のコードを変更します.
修正内容は次のとおりです.
com.jphh.takephoto.uitl.TConstantのメソッドgetFileProviderNameを変更します.public final static String getFileProviderName(Context context){return context.getPackageName()+「.fileprovider」;}変更:public final static String getFileProviderName(Context context){return context.getPackageName()+「.fileProvider」;
2.2リストファイルのProviderに置換ルールを追加します.コードは以下の通りです. 達成される効果は、すべてのnameを置き換えることです. android.support.v 4.content.FileProviderのプロパティ
<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileProvider"
    android:grantUriPermissions="true"
    tools:replace="name,authorities,exported,grantUriPermissions"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
       tools:replace="name,resource" 

android:resource=
"@xml/file_paths"
/>
provider
>
2.3アプリのres/xml/にfile_を作成するpaths.xmlファイル
buglyを takehpotoにアクセスするディレクトリパスを追加
ファイルの内容は次のとおりです.
xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path
            name="files_root"
            path="Android/data/com/pgyersdk" />
        <external-path
            name="external_storage_root"
            path="." />
	<root-path path="" name="camera_photos" />

paths
>
resources
>
これで完成です. 
このソリューションの考え方は、buglyとtakephotoがProviderのauthoritiesプロパティを呼び出すことです.
しかしbuglyが呼び出したauthorities=「${applicationId}.fileProvider」は、 
takephotoフレームワークで呼び出されるのはauthorities="${applicationId}.fileprovider"
実は1つの大文字の1つの小文字で、どのように言って、takephotoの作者はラクダの峰の命名を採用していません.takyphotoの枠のプラスの原コードとリストのファイルの配置の中から、それが呼び出したのは小文字の.fileproviderという属性の値です
アプリのインベントリファイルにtakephotoで必要なxmlと同じファイル名のファイルを作成しました---file_paths.xml; bugly takephotoに必要なファイルパスをすべてコピーします
次に、リストファイルにname値と同じProviderラベルを作成します.authorities=「${applicationId}.fileProvider」とします. 
takephotoの元のコードを変更することで、takephotoにアクセスしてアプリ層のfileProviderを手に入れることができます.fileproviderではありません.
これによりbuglyとtakephotoは合併後のリストファイルの中で、自分の必要なパスを手に入れることができる.
三. エンド・ソリューション: カスタムprovider
そんなに面倒じゃない
ネットワーク依存takephotoライブラリ、オフラインライブラリなし
3.1 APP層でproviderをカスタマイズする.
BuglyFileProvider.javaの作成
/**
 * Created by liuyu on 2017/5/22.
 */
//  bugly  7.0  
public class BuglyFileProvider extends android.support.v4.content.FileProvider {
}

3.2 res/xml/file_paths_bugly.xml 
xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path
            name="files_root"
            path="Android/data/com/pgyersdk" />
        <external-path
            name="external_storage_root"
            path="." />
    paths>
resources>

3.3インベントリファイルに以下のように構成する

<provider
    android:name=".utils.BuglyFileProvider"
    android:authorities="${applicationId}.fileProvider"
    android:exported="false"
    android:grantUriPermissions="true"
    tools:replace="name,authorities,exported,grantUriPermissions">

    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths_bugly"
        tools:replace="name,resource" />
provider>

!大功を成し遂げる
上に作成したすべてのファイル名は、結果に影響を与えません.
考え方:カスタムProvideを作成し、v 4パッケージのProviderを継承します.次にauthoritiesの値を android:authorities="${applicationId}.fileProvider"
次にresourceのxmlをbuglyに必要なパスに追加します.
takephotoはネットワーク依存を使用して、自分のリストファイルで構成されているfileを使用します.path.xmlのパス
マージされたインベントリファイルからカスタムproviderとtakephotoライブラリのproviderを調べることができます.
提案:takephoto buglyの2つのフレームワークは、xmlのマージに失敗しないように、カスタムProvideを使用します.