2016-07-13 15 views
7

Android 6.0以降のアクセス権に問題があります。Android 6.0のアクセス許可とマウントOBB

私が取り組んでいるゲームでは、WRITE_EXTERNAL_STORAGE権限が使用されています。 Android 6.0以降では、ユーザーに表示を許可するアラートが表示されなければなりませんでした。

このアラートを取り除くリクエストを受け取りました。つまり、ゲームでWRITE_EXTERNAL_STORAGEを使用することはできません。

技術的には、ゲームは外部ストレージを今どこにでも書き込んだり読み込んだりすることはありません。すべてのセーブとキャッシュされたファイルは、アプリケーション固有のディレクトリ(/storage/emulated/0/Android/data/com.company.productname)に保存されます。 しかし、ゲームはOBBファイルを読み込む必要があります。 /storage/emulated/0/Android/obb/com.company.productnameディレクトリに格納されます。

ゲームであってもデバイス上のWRITE_EXTERNAL_STORAGEまたはREAD_EXTERNAL_STORAGEせずに、このディレクトリへのアクセス権を持っている:

  • モトローラネクサス6
  • LG Nexus 5の

しかし、持っていないようですこのディレクトリへのアクセス:

  • サムスンギャラクシーS5、S6、S7
  • Nvidiaのシールドタブレット

私も店からゲームをダウンロードするシミュレートするために、アルファテストを使用して、それをチェックしました。

ストレージへのアクセス許可が与えられると(App Settingsを介して)、すべて正常に動作します。

OBBの取り付け方法は?

Iを使用アンリアルエンジン4は、OBBファイルを処理するために、C open()関数を使用している:

ローカルパスは、OBBファイルのフルパスである
int32 Handle = open(LocalPath, O_RDONLY); 

:/ストレージ/ /エミュレート0 /アンドロイド/ OBB/com.company.productname/main.10003.com.company.productname.obb

質問は以下のとおりです。ゲームはREAD/WRITEの_EXTERNAL_STORを

  1. 必要ありませんOBBファイルを読み込んでダウンロードするにはAGE?
  2. 「はい」の場合は、ユーザーに許可を求める警告を取り除く方法を教えてください。
  3. いいえ、なぜサムスンギャラクシーSシリーズは、このようなトラブルを作るのですか?
+0

は、このアラートを取り除く要求を受け取りました。愚かな要求。それらを教えてください!あなたのアプリの設定にアクセスして、許可を求めることができます。 – greenapps

+0

どのようにOBBにマウントし、UE4に 'LocalPath'として何を渡していますか? –

+0

また、これらの異なるデバイスでAndroidのどのバージョンが動作していますか? –

答えて

8

[OK]を、の設定何らかの理由API23

https://code.google.com/p/android/issues/detail?id=197287

...問題がどこかに記載されていたようだが、私はそれが正確な問題でした知らなかったので、私は見つけることができませんでした適切なユーザではなく、そのためにアプリケーションにアクセスすることができないため、OBBのユーザはrootになります。

デバイスの再起動後、すべて正常に動作します。

この時点で、これに対する明確な回避策はありません。すべての必要かつ有益な情報を提供するための

おかげ@Larry :)適切なソリューションを指すため@Larryへ

+0

今日までまだ回避策はないと思われますか? – derFunk

0

上記のコメントスレッドに基づいて回答を提供します。問題はLocalPathの提供方法です。 Androidでは、異なるメーカー間でファイルシステムのパスが一貫していないため、ストレージパスについては何も仮定しないでください。

そうではなく、この(単なるサンプルコード)があります。

public class MyActivity extends Activity { 
    static final String LocalPath = "/storage/emulated/0/Android/obb/com.company.productname/main.10003.com.company.p‌​roductname.obb "; 
    ... 
} 

あなたはこのような何かを実行する必要があります。

public class MyActivity extends Activity { 
    File mObb; 
    ... 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(); 
     ... 

     mObb = new File(getObbDir(), getPackageName() + ".obb"); 

     // Get the path for passing to UE4 later 
     String LocalPath = mObb.getAbsolutePath(); 
    } 

をこれはあなたのコードは、あなたのための正しいOBBの場所を取得することを保証しますアプリをプライマリ外部ストレージに保存します。 OBBをそこに保存し、後であなたのアプリがUE4を起動したときに、そのファイルを右に指すことができます。

OBB(およびその他のファイル)のプライマリ外部ストレージのアプリの場所には、そのアプリのを読み書きする権限は必要ありません。外部ストレージ上のパスが上記の方法で生成されたパスでない場合、データを書き込むためには、WRITE_EXTERNAL_STORAGEパーミッションが必要です。

+0

ヒントありがとうございますが、まだ... getObbDir()とgetAbsolutePath()を使用してアドレスを取得し、返されました... /storage/emulated/0/Android/obb/com.company .productname;) また、EACCES 13/*許可が拒否された*/' もあります。作成したディレクトリにapkとobbを入れてゲームをインストールしますAndroid/obbにインストールし、APKをインストールします。私はObbをストレージのルートに入れて、アンドロイドのファイルマネージャを経由して適切なディレクトリにコピーしてからインストールします...それは動作し、アクセスします... – zompi

+0

UE4エンジンは、アプリケーションのプロセス内で実行されていますか、それとも別のコンポーネント/パッケージですか? –

+0

これは、アプリケーションとobbファイルをインストールする際に非常に奇妙に思えます。アプリのインストールは 'adb'またはプレイストア経由で行う必要がありますので、特別な保存場所は必要ありません。通常、あなたのobbファイルは、アプリケーションによってダウンロードされ、obbディレクトリに置かれます*または*あなたはGoogle Playでそれらをホストし、その方法でそれらをプルダウンできます。フレームワークはobbディレクトリを作成するものである必要があります。そのため、権限が正しく設定されるようにAPKを最初にインストールする必要があります。手動でディレクトリ(adbシェル?)を作成し、それを使用しようとすると、問題が発生します。 –

1

感謝。 AOSP APK拡張サポートlibrayが許可なしに動作していない理由を、不思議に思っている人のために

は、ここにあなたが親切ストアからアプリケーションが許可を足すたかどうかをチェックするために招待されている修正APKExpansionSupport.java

package com.android.vending.expansion.zipfile; 
/* 
* Copyright (C) 2012 The Android Open Source Project 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 
import java.io.File; 
import java.io.IOException; 
import java.util.Vector; 

import android.content.Context; 

public class APKExpansionSupport { 
    public static String[] getAPKExpansionFiles(Context ctx, int mainVersion, int patchVersion) { 
     String packageName = ctx.getPackageName(); 
     Vector<String> ret = new Vector<>(2); 
     File expPath = ctx.getObbDir(); 
     // Check that expansion file path exists 
     if (expPath.exists()) { 
      if (mainVersion > 0) { 
       String strMainPath = expPath + File.separator + "main." + mainVersion + "." + packageName + ".obb"; 
       File main = new File(strMainPath); 
       if (main.isFile()) { 
        ret.add(strMainPath); 
       } 
      } 
      if (patchVersion > 0) { 
       String strPatchPath = expPath + File.separator + "patch." + mainVersion + "." + packageName + ".obb"; 
       File main = new File(strPatchPath); 
       if (main.isFile()) { 
        ret.add(strPatchPath); 
       } 
      } 
     } 
     String[] retArray = new String[ret.size()]; 
     ret.toArray(retArray); 
     return retArray; 
    } 

    public static ZipResourceFile getResourceZipFile(String[] expansionFiles) throws IOException { 
     ZipResourceFile apkExpansionFile = null; 
     for (String expansionFilePath : expansionFiles) { 
      if (null == apkExpansionFile) { 
       apkExpansionFile = new ZipResourceFile(expansionFilePath); 
      } else { 
       apkExpansionFile.addPatchFile(expansionFilePath); 
      } 
     } 
     return apkExpansionFile; 
    } 

    public static ZipResourceFile getAPKExpansionZipFile(Context ctx, int mainVersion, int patchVersion) throws IOException{ 
     String[] expansionFiles = getAPKExpansionFiles(ctx, mainVersion, patchVersion); 
     return getResourceZipFile(expansionFiles); 
    } 
} 
2

です。

関連する問題