41

私はアプリケーションを開発し、正常に動作しています。

アプリケーションにアプリケーション ライセンス機能を使用しました。それでは、Google Play にアプリケーションをアップロードします。

アプリケーション ライセンスの使用方法と APK 拡張ファイルの作成方法を教えてください。

4

5 に答える 5

96

拡張ファイルは、100MB を超える apk サイズをアップロードする制限を取り除きます。apk をアップロードするときに、これらのファイルを添付する必要があります。各アプリは、APK ごとに最大 4 GB (2 GB - メイン、2 GB - パッチ) の追加データを提供できます。

拡張ファイルを作成する際に従う必要がある命名規則があります

[main|patch].<expansion-version>.<package-name>.obb

ノート:

  1. main- これらのファイルがないと、アプリケーションは実行されません
  2. patch-追加のファイルです。これがなくてもアプリケーションを実行できます
  3. expansion-version- 異なるバージョンの拡張ファイルが競合しないように、apk に与えるバージョン
  4. package-name-これはあなたの固有のパッケージ名です

.obb追加はしていません。アップロード中に Google によって暗黙的に追加されます。

現在のディレクトリにすべてのコンテンツがあると仮定して、すべてのコンテンツを選択し、zip という名前main.2.com.xyz.abc.zipにして、apk のアップロード中に添付します。

ここに画像の説明を入力

このすべてのアップロード部分、現在はダウンロード部分

まず、SDK-Manager をクリックしてGoogle の追加パッケージをダウンロードする必要があります。

ここに画像の説明を入力

既存のソースから新しいプロジェクトを作成し、パスsdk-path/extras/googleからmarket_licensingplay_apk_expansionをインポートします

覚えておいてください: 無料アプリにはライセンスは必要ありませんが、拡張の概念は必要です。暗黙的に管理されるプロジェクトに market_licensing の参照を与えることで煩わされる必要はありません。

play_apk_expansiondownloader_libraryzip_file、 の3 つのプロジェクトが含まれていますdownloader_sample

Market_licensing の参照を持つ downloader_library 自体。

downloader_sampleここで、まずパッケージ名 (テスト用) をパッケージ名 (アップロードされた apk と同じパッケージ名) に変更することに集中する必要があります。

非常に重要

SampleDownloaderActivityナビゲートで...

private static final XAPKFile[] xAPKS = {
            new XAPKFile(
                    true, // true signifies a main file
                    2, // the version of the APK that the file was uploaded
                       // against
                    xxxxxxxxxxxL // the length of the zipfile in bytes right click on you expansion file and get the size in bytes, size must be same as zip size
            ),

    };

ここで、このアクティビティは拡張ファイルをダウンロードし、それをsdcard/Android/obb/[main|patch].<expansion-version>.<package-name>.obb無視する obb に保存します。このファイルを必要な場所に解凍するだけです (sdcard/Android/dataアプリケーションがアンインストールされると削除されるため、推奨されます)。

拡張ファイルを Play ストアから直接ダウンロードして保存する最新のデバイスがあるsdcard/Android/obb/ため、すべてのケースを注意深く確認する必要があります。

  1. Obb は既にダウンロードされています
  2. 使用可能なメモリ
  3. ダウンロードしたが解凍していない
  4. 選択するメモリー (メモリーケースを参照)

メモリーケース:

新しいデバイスを使用する場合、または元の場合。micromax funbook ならメモリーは 3 つ

  • /data/data/ (電話機の内部メモリ) getFilesDirectory()
  • /mnt/sdcard/ (電話の内蔵 SD カード) Environment.getExternalStorageDirectory()
  • /mnt/extsd/ (外部SDカード) /mnt/extsd

これがあなたを助け、あなたの要件を満たすことを願っています.

そして、もう 1 つ、以下でこれを使用しZipHelperてコンテンツを解凍します。

ZipHelper.java

public class ZipHelper
{
    boolean zipError=false;

    public boolean isZipError() {
        return zipError;
    }

    public void setZipError(boolean zipError) {
        this.zipError = zipError;
    }

    public void unzip(String archive, File outputDir)
    {
        try {
            Log.d("control","ZipHelper.unzip() - File: " + archive);
            ZipFile zipfile = new ZipFile(archive);
            for (Enumeration e = zipfile.entries(); e.hasMoreElements(); ) {
                ZipEntry entry = (ZipEntry) e.nextElement();
                unzipEntry(zipfile, entry, outputDir);
                
            }
        }
        catch (Exception e) {
            Log.d("control","ZipHelper.unzip() - Error extracting file " + archive+": "+ e);
            setZipError(true);
        }
    }

    private void unzipEntry(ZipFile zipfile, ZipEntry entry, File outputDir) throws IOException
    {
        if (entry.isDirectory()) {
            createDirectory(new File(outputDir, entry.getName()));
            return;
        }

        File outputFile = new File(outputDir, entry.getName());
        if (!outputFile.getParentFile().exists()){
            createDirectory(outputFile.getParentFile());
        }

        Log.d("control","ZipHelper.unzipEntry() - Extracting: " + entry);
        BufferedInputStream inputStream = new BufferedInputStream(zipfile.getInputStream(entry));
        BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile));

        try {
            IOUtils.copy(inputStream, outputStream);
        }
        catch (Exception e) {
            Log.d("control","ZipHelper.unzipEntry() - Error: " + e);
            setZipError(true);
        }
        finally {
            outputStream.close();
            inputStream.close();
        }
    }

    private void createDirectory(File dir)
    {
        Log.d("control","ZipHelper.createDir() - Creating directory: "+dir.getName());
        if (!dir.exists()){
            if(!dir.mkdirs()) throw new RuntimeException("Can't create directory "+dir);
        }
        else Log.d("control","ZipHelper.createDir() - Exists directory: "+dir.getName());
    }
}
于 2012-07-30T07:25:13.280 に答える
13

最初に、helloworld.jpg を使用して /assets/helloworld.jpg から拡張に移行するとします。

  1. zip ファイルを作成しますが、次のファイル パターンを使用し、ファイル拡張子 .obb を終了します。
 `[main|patch].{expansion-version}.{package-name}.obb`

たとえば、pkg 名が「com.earth.helloworld」でバージョン = 1

の場合、出力拡張ファイル名は patch.1.com.earth.helloworld.obbのようになります。これは、zip ファイル の後に
helloworld.jpg を含む zip ファイルです。 ファイル
サイズに注意し てここに画像の説明を入力 ください。こんにちは世界/

  1. 次に、obb ファイルを sdcard にアップロードします (例: /mnt/sdcard/Android/obb/com.earth.helloworld/patch.1.com.earth.helloworld.obb)。

  2. 次に、拡張ファイルを取得するメソッドを作成します

    public ZipResourceFile getExpansionFile() {
    
    String fileName = Helpers.getExpansionAPKFileName(this, false, 1);
    
            int filesize = 445461159;
    if (Helpers.doesFileExist(this, fileName, , false)) {
    
        try {
            return APKExpansionSupport.getAPKExpansionZipFile(
                    getBaseContext(), 1, 1);
    
        } catch (IOException e) {
            // TODO Auto-generated catch block
    
            e.printStackTrace();
        }
    }
    return null;       }
    
  3. 最後に、この 2 行を使用して helloworld.jpg を取得します。
    InputStream istr = getExpansionFile().getInputStream(strName);

    Bitmap bitmap = BitmapFactory.decodeStream(istr);
    
于 2013-01-05T08:28:00.883 に答える
11

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-24T19:51:39.360 に答える
-8

プロジェクトの Eclipse で、マウスの右ボタンをクリックし、次の手順に従います: Android Tools->Export Signed Application Package -> ....

于 2012-07-30T06:04:41.797 に答える