4

〜80moのPNGを含むアプリケーションを実行しようとしています(これはオフラインアプリなので、電話に保存する必要があります).

アプリケーションはローカルで完全に動作しますが、apk > 50mo をアップロードできません。そのため、すべての PNG を含む拡張ファイルを実装しようとしています。そこで、Linux で次の簡単なコマンドを使用_zip_ -0 _main.1.com.ctai.irisst.zip_ *_.png_します。/res/drawable-mdpi で拡張ファイルを作成し、手動で配置します。次に、このコード/Android/data/com.ctai.irisst/
を使用して、電話のストレージにあるすべてのデータを解凍しますが、アプリを起動すると、10 秒ほど空白の画面しか表示されず、Android からアプリケーションが応答しないと通知されます。ファイル エクスプローラーで、10 個までの PNG 画像が解凍され、毎秒 1 ファイルが抽出されていることがわかります。(そして、バッファを使用する場合でも、アプリケーションをロードするのに 20 秒以上かかります)Logcat

次のライブラリを実装しました。

"downloader_library","licencing_library","Sample_downloader" and "zip_file"  

しかし、私は今のところそれを実際には使用しませんでした。(どうすればいいの?)

私の質問は簡単です。拡張ファイルを簡単に作成して、ユーザー エクスペリエンスを妨げることなく画像を使用するにはどうすればよいですか? 拡張ファイルに関するチュートリアルはあまり多くなく、サンプル プロジェクトも見つからないので、少し迷っています。

4

3 に答える 3

3

パッケージを解凍する必要はありません。これにより、拡張ZIPファイル内のすべてのPNGを読み取ることができます。

// Get a ZipResourceFile representing a merger of both the main and patch files
ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(appContext,
        mainVersion, patchVersion);

// Get an input stream for a known file inside the expansion file ZIPs
InputStream fileStream = expansionFile.getInputStream(pathToFileInsideZip);

**編集**

上記のコードでは、InputStreamはZIPファイル自体ではなく、ZIPアーカイブ内のファイルを指していることに注意してください。たとえば、 ZIPアーカイブ内のbackgroundというディレクトリの下にflower.pngを配置した場合、次のようにそのファイルへのInputStreamを設定できます。

InputStream fileStream = expansionFile.getInputStream("background/flower.png");

**編集**

ZIPファイルを置いた場所が間違っていると思います。開発者ガイドによると:

パッケージ名がcom.example.androidの場合、共有ストレージスペースにディレクトリAndroid / obb /com.example.android/を作成する必要があります。

テストが成功したら、Developer'sConsoleからAPKと一緒に拡張ZIPをアップロードできます。

APK拡張ファイルを読みましたか?それはかなり簡単です。

于 2013-01-03T13:34:45.677 に答える
1

APK 拡張の動作方法や、ライブラリを動作させるために Android Studio を使用している場合にいくつかの変更があるため、この投稿でここにたどり着いた人々のための有益な情報がいくつかあります。

注 1

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

注 2

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

注3

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

ところで

これらのライブラリを使用すると、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;
}

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

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;
        }
    }

また、Google が提供する 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 番目のパラメーターも必要です。

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

他の

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

expansionFile.getInputStream(pathToFileInsideZip);`

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

zip -n .mp4 -r zipfile.zip . -x ".*" -x "*/.*"
于 2014-09-24T20:00:31.577 に答える