web-dev-qa-db-ja.com

Android Studioを使用して拡張ファイルを作成する方法Android?

.apkをアップロードする必要がありますが、50MBの制限を超えています。

ドキュメントといくつかの質問でこれについて読みましたが、これを機能させるのに苦労しています。

これを行う方法を説明するチュートリアルがありますか(Android Studioを使用)、Gradleを使用してこれを行う方法があるかどうか)。

15
groff07

私はいくつかのプロジェクトでこれを行いましたが、簡単な方法を見つけられませんでした。での指示

http://developer.Android.com/google/play/expansion-files.html

基本を理解するのに役立ちましたが、プロセスの一部(「Androidアップデートプロジェクト」など)がGradleで正しく機能しないことがわかりました。

以下の手順は、必要なライブラリを使用してプロジェクトを設定するのに役立ちます。その後、公式ドキュメントに戻って、含めたすべてのものをどうするかを理解できます。

これらの権限をAndroidManifest.xmlに追加します

<uses-permission Android:name="com.Android.vending.CHECK_LICENSE"/>
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE"/>
<uses-permission Android:name="Android.permission.INTERNET"/>
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission Android:name="Android.permission.WAKE_LOCK"/>
<uses-permission Android:name="com.google.Android.providers.gsf.permission.READ_GSERVICES"/>

Play開発者サービスの依存関係をbuild.gradleに追加します

dependencies {

    compile 'com.google.Android.gms:play-services:4.0.30'
}

SDK Managerを開き、Google Play APK拡張ライブラリGoogle Playライセンスライブラリをインストールします)。

Javaソースファイルをこれらのフォルダーからプロジェクトのsource/main/Javaフォルダーにコピーします。

YOUR-Android-SDK-FOLDER\extras\google\play_apk_expansion\Zip_file\src

YOUR-Android-SDK-FOLDER\extras\google\play_apk_expansion\downloader_library\src

YOUR-Android-SDK-FOLDER\extras\google\play_licensing\library\src

開いた

YOUR-Android-SDK-FOLDER\extras\google\play_apk_expansion\downloader_library\res

drawable-hdpidrawable-mdpiおよびlayoutをプロジェクトのsource/main/resフォルダーに配置します。

valuesフォルダー内のすべてのファイルについて、ファイルのコンテンツをプロジェクト内の一致するファイルにマージします。

拡張するクラスを作成しますAndroid.content.BroadcastReceiver

マニフェストに次のようなものを追加します。

<receiver Android:name="mypackage.MyReceiver"/>

拡張するクラスを作成しますcom.google.Android.vending.expansion.downloader.impl.DownloaderService

マニフェストに次のようなものを追加します。

<service Android:name="mypackage.MyDownloaderService"/>

プロジェクトをコンパイルし、関連するエラーを探します

import com.Android.vending.expansion.downloader.R;

代わりに、ここに独自のプロジェクトリソースをインポートしてください。

30
SharkAlley

Android Studioで拡張ファイルを使用するアプリを作成することに成功しました。これを行うことは大きな課題です。最初のアドバイスは、大きなアプリが必要な場合は、 Apple製品。Appleは大きなアプリに非常にうまく対応します。一方、Androidは、作成をほぼ不可能にしました。 100Megより大きいアプリ。

大きなAndroidアプリを作成したい場合は、最初にアプリを動作させます。ただし、compileSkdVersionが22より大きいバージョンのアプリはリリースしないでください。後で、拡張ライブラリについて説明します。それ以降のバージョンでは動作しないため、最終的なアプリはバージョン22以下である必要があります。新しいバージョンをリリースした場合、Googleストアではバージョン22に戻ることができません。その場合は、アプリIDを破棄して、バージョン22を使用した新しいアプリ。

必要なライブラリとコードは、tools-> Android-> SDK Manager "から取得できます。[SDKTools]タブで、Google Play APK拡張ライブラリおよび-を選択してロードします。 Google Play Licensing Library。SDKManagerウィンドウの上部にあるAndroid SDK Location:フィールドに注意してください。ダウンロード後、これらのファイルはSDKディレクトリの( extras/google。この時点で、関心のあるディレクトリはmarket_apk_expansionおよびmarket_licensingと呼ばれます。

拡張ファイルに関するAndroidのドキュメントには、これらのライブラリをプロジェクトにリンクするための手順が記載されています。私はこの仕事をしようとして何時間も費やしました。一般的に、Android Studioは悪いことをします。まず、入力内容が正しくない場合にエラーメッセージが表示されることはありません。どちらの場合も、拡張ファイルを機能させるためにライブラリを組み込みました。私のアプリでは、Android Studioのライブラリ機能を使用していません。ただし、ライブラリをアプリに配置するのは簡単ではありません。

まず、これらのライブラリは古く、最新のSDKバージョンでは機能しないことを説明する必要があります。ライブラリを22のcompileSdkVersionで動作させることができました。(module:appのbuild.gradleを参照してください。)targetSdkVersionは22である必要があります。 dependencies必要がありますcompile'c​​om.Android.support:appcompat-v7:22.2.1 '。これにより、DisplayWebpageActivity.classを使用できるようになります。これはバージョン23で追加されたと思いますが、このバージョンの22でも機能するようです。compile'c​​om.google.Android.gms:play-services-appindexing:8.1.0 'も追加しました。しかし、これが必要かどうかはわかりません。

私の意見では、一般の人々がアプリをダウンロードするために必要なコードを書くことは期待できません。 「エクストラ」に含まれているサンプルのコードを使用しました。このサンプルは/ extras/google/market_apk_expansion/downloader_sampleにあります。このサンプルアプリ(.obbファイルをロードするだけです)をアプリの開始ページにする必要があります。サンプルプログラムにインテントを追加して、.obbファイルが存在するときにアプリの実際の最初のページを呼び出すようにします。

サンプルプログラムは、「res」ディレクトリと3つの.Javaファイルで構成されています。 3つの.JavaファイルをメインのJavaディレクトリに配置する必要があります。「res」ディレクトリの名前を(「res2」に)変更し、これを通常のディレクトリと同じディレクトリに配置します。 「res」ディレクトリ。Android Studioが両方の「res」ディレクトリを認識するようにするには、「build.gradle(Module:app)」ファイルに次を追加します。

sourceSets {
    main {
        res.srcDirs = ['src/main/res']
        res.srcDirs += [ 'src/main/res2']
        res.srcDirs += [ 'src/main/res3']
    }
}

上記はAndroid {}セクションにあります。 「res3」はライブラリから取得されます。

3つの.Javaサンプルファイルのすべてのパッケージ名と一部のインクルードは、パッケージ名と一致するように修正する必要があります。 「res2」にはアプリ名と競合するアプリ名がありますので削除してください。マニフェストを修正して、実行を開始する必要がありますSampleDownloaderActivity。そして、SampleDownloaderActivityを修正して、.obbファイルが存在するときにアプリの開始を呼び出すようにします。

Androidドキュメントでは、.obbファイルをZipアーカイブにすることを提案しています。これは最初の拡張ファイルアプリで行いました。私のアプリケーションではうまくいきませんでした。小さな画像がたくさんありました。これらの画像はすでに圧縮されています(.jpg)。画像へのアクセスが遅いため、パフォーマンスの低いアプリを作成することになりました。

2番目の拡張アプリでは、ディレクトリに「パッチ」ファイルを使用し、写真を「メイン」ファイルに配置しました。写真にアクセスするには、パッチファイルを読み取り、写真の名前、場所、長さを含む辞書に入れます。これにより、アプリは、ランダムアクセスファイルとして扱われるメインファイルのどこに画像があるかを見つけることができます。必要な写真はアプリのストレージにコピーされ、適切な名前(xxx.jpg)が付けられます。次に、HTMLコード内で写真にアクセスします。

2つのライブラリもアプリに統合されています。 「res3」に名前が変更され、通常の「res」ディレクトリと同じディレクトリに配置される「res」ディレクトリがあります。 app/src/main/Java/com/developer/app_nameディレクトリに、「ダウンローダー」ディレクトリと「ライセンス」ディレクトリを追加しました。パッケージ名やその他の元のパッケージ名の出現を修正しながら、ライブラリをディレクトリに移動するプログラムを作成しました。プログラムは、変更する必要のある名前の一部しか取得しませんでした。他の種類のエラーを無視しながら、これらすべての名前を修正する作業を続けてください。 「res3」ディレクトリを参照する多くのものは、次のようなインポートステートメントを追加するまで機能しませんでした。

import com.developer.app_name.R;

ライセンスライブラリのLicenseChecker.Javaファイルには、SDKバージョン22でクラッシュするコードが含まれています。このコードを修正するか、古いSDKバージョンを使用する必要があります。 150行目あたりに移動します。boolean bindResult = mContextからContext.BIND_AUTO_CREATE);で始まるコードをコメントアウトします。次のように置き換えます。

Intent serviceIntent = new Intent(
    new String(Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U=")));
serviceIntent.setPackage("com.Android.vending");

ライブラリには他にもいくつかのエラーがあり、Android Studioはそれらを修正する方法について適切な提案をします。

デバッグ中に、手動で.obbファイルをデバイスに配置できます。私のAndroidこれはNexus5/Internal storage/Android/obbで行われ、com.developer.app_nameというフォルダーを作成します。コンピューターに表示されるものが常にではないことを発見しましたデバイスに何が入っているか。実際に何が入っているかを確認するために、デバイスの電源をオフにしてからオンにする必要がある場合があります。コンピューターで.obbファイルを確認できたのに、アプリが.obbファイルを見つけられなかった理由を理解するために多くの時間を費やしました。 。実際、.obbファイルはありませんでした。

アプリが.obbファイルの有無にかかわらずデバッグで動作し、.obbファイルがないと、ストアから取得できないことが通知されたら、テストを終了するためにアプリを本番環境に移行します。これがストアへの最初のアップロードである場合、アップロードソフトウェアは.obbファイルの要求に失敗します。だからあなたのアプリをアップロードします。次に、リリースを試みる前に、ロード番号とバージョン番号を変更して、もう一度アップロードします。今回は.obbファイルを要求します。

2
Steve Sullivan

Apk拡張の動作方法が変更されたため、またAndroid Studioを使用してライブラリを動作させる場合)、この投稿で終わる人々のためのいくつかの完全な情報があります。そのため、Playサービスライブラリとダウンローダーライブラリが必要になります(また、拡張ファイルとしてZipを使用し、解凍せずにZipからファイルやムービーを直接読み取る場合はZipツールも必要です)。

これらのライブラリを使用すると、apk拡張ダウンロードを実装するのは非常に簡単です。次のことを確認してください。

  1. アクティビティ(ダウンロードが自動的に行われていないときに拡張パックのダウンロードを実装するアクティビティ)は、IDownloaderClientを実装します。

  2. サービスとレシーバーを設定し、マニフェストに設定します。

  3. サービスクラスのBASE64_PUBLIC_KEYは正しいです。最初のapkをアップロードします=>アプリの下の開発者コンソールでサービスとAPIを確認します=>このアプリのライセンスコード。

このコードは、拡張ファイルがデバイス上にあるかどうかを確認するために使用されます。

boolean expansionFilesDelivered() {
    for (XAPKFile xf : xAPKS) {
        String fileName = Helpers.getExpansionAPKFileName(this, xf.mIsMain, xf.mFileVersion);
        Log.i(TAG, "Expansion filename " +fileName);
        if (!Helpers.doesFileExist(this, fileName, xf.mFileSize, false))
            return false;
    }
    return true;
}

これは、拡張ファイルを表すクラスXAPKSを使用します。これは、メインファイルまたはパッチファイルのいずれかで、特定のファイルサイズ(バイト)を持ち、apkバージョン(最初に追加されたもの)に関連付けられています。

private static class XAPKFile {
        public final boolean mIsMain; // true
        public final int mFileVersion; //example 4
        public final long mFileSize; //example 126515695L
        // example => main expansion that was first introduced in apk version 4 and is 126515695 bytes in size

        XAPKFile(boolean isMain, int fileVersion, long fileSize) {
            mIsMain = isMain;
            mFileVersion = fileVersion;
            mFileSize = fileSize;
        }
    }

また、グーグルが提供するZipツール(com.Android.vending.zipfile)を使用して、拡張ファイルから直接映画ファイルやその他のものを読み取るのも非常に簡単です。

まず、ライブラリで提供されているメソッドを使用して拡張ファイルを取得します。パラメーターは、メインの拡張apkバージョン(必要な拡張パックが最初に追加されたapkバージョン)とパッチapkバージョンを表す整数です。

ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(context, APKX_MAIN_APK, APKX_PATCH_APK);

ビデオ

このzipresourcefileから直接ビデオを再生する場合:

AssetFileDescriptor a = expansionFile.getAssetFileDescriptor(pathToFileInsideZip);

これで、このassetFileDescriptorからFileDescriptorを取得し、これをメディアプレーヤーで使用できます。メディアプレーヤーにビデオを再生させるための正しい構文には、2番目と3番目のパラメーターも必要です。AssetFileDescriptorから取得できる開始オフセットと長さです。

player.setDataSource(a.getFileDescriptor(), a.getStartOffset(), a.getLength());

その他

他のすべてのもの(画像など)については、zipresourcefileの入力ストリームを取得できます。

expansionFile.getInputStream(pathToFileInsideZip);`

また、これが機能するように、Zip内のビデオを圧縮しないようにしてください。たとえば、.mp4ファイルを圧縮しないでください。

Zip -n .mp4 -r zipfile.Zip . -x ".*" -x "*/.*"

注1

拡張ファイルを取得するためのリンクがまだアクティブになっていないため、ドラフトを使用できなくなりました。最初に、拡張ファイルを使用してバージョンをAlphaまたはBetaにアップロードする必要があります。 (拡張ファイルの追加は、アップロードした2番目以降のapkからのみ可能です)したがって、APKの下の開発者公開セクションで詳細をクリックすると、apk拡張ファイルがリストされていることを確認してください。

注2

Android studioを使用していて、ダウンローダーライブラリを利用したい場合は、パッケージ名とJavaファイルを独自のアプリsrcディレクトリにコピーするだけではいけません。 。Eclipseにダウンローダーライブラリをインポートし、[エクスポート] => [gradleビルドファイル]を選択します。その後、ライブラリをモジュールとしてAndroid studio)にインポートできます。

これについてはよくわかりませんが、Playストアからアプリを少なくとも1回ダウンロードし、テストデバイスのアカウントでアプリにアクセスできるようにする必要があると思います。したがって、アルファを使用している場合は、google +テストグループを作成し、自分自身または他のテストデバイスをそれに追加します。

2
Jordy

それらをモジュールとして追加するか、Eclipseにライブラリとしてインポートし、Android studio and import non Android studio project ..プロジェクトディレクトリに移動します

0
Hani Hussein