0

私はAndroid 4.4で完全に動作するが、Android 7では動作しないアプリを書いています。 2つのデバイスが根付いています。Android 4.4(API19)とAndroid 7(API24)の間のファイルアクセス権の変更はありますか?

私のアプリケーションの目的は、他のアプリケーションのデータディレクトリ(com.game.origと呼ぼう)からファイルを取得し、アプリケーションディレクトリ(それらをcom.game.cheatと呼ぶ)にコピーすることです。それらを読み取ってから元のディレクトリに書き戻す前に変更してください。

だから私はこのようなディレクトリcom.game.cheatするcom.game.origからファイルをコピーし、「SU」(機能を投げるExecuteAsRootBase.javaが見つかっ) を使用して:ここエンディング

PackageManager m = context.getPackageManager(); 
String appDir = getPackageDirectory("com.game.orig",m);// /data/user/0/com.game.orig/files/ 

String localDir = getPackageDirectory(context.getPackageName(),m);// /data/user/0/com.game.cheat/files/ 

if (ExecuteAsRootBase.canRunRootCommands()) { 
    ExecuteAsRootBase rootBase = new ExecuteAsRootBase(); 
    Sting fileName="savedgame.dat"; 
    int uid=context.getApplicationInfo().uid;//get the uid (owner) of my app. 

    //Create localDir (files subdirectory) if not exists 
    File directory = new File(localDir); 
    if (!directory.exists()) { 
     directory.mkdirs(); 
     //adjust file permission (not sure it's realy needed) 
     rootBase.executecmd("chmod 777 "+ localDir); 
     rootBase.executecmd("chown " + uid + "." + uid + " " + localDir); 
    } 
    //copy file from appDir to localdir using 'su' 
    rootBase.execute("cp "+ appDir +fileName + " " + localDir)){ 
    //adjust file permission 
    rootBase.execute("chmod 777 "+ localDir +fileName); 
    rootBase.execute("chown " + uid + "." + uid + " " + localDir + fileName);   
} 

を、すべてが正常に動作します:

私はpermsを持つ私のファイルディレクトリを持っています:drwxrwxrwxとu0_a115、グループu0_a115が所有しています。 (/data/data/com.game.cheatの所有者/グループに一致します) と同じ所有者/グループとパーマネントを持つ私のコピーしたファイル:-rwxrwxrwx

コピーしたファイルを開いて読むと、

InputStream input = context.openFileInput(fileName); 

openFileInputは例外をスロー:

java.io.FileNotFoundException: /data/user/0/com.game.cheat/files/savedgame.dat (Permission denied) 

をそして、これが唯一のAndroid 7.0 API24との電話でocccurs。

誰でも私の了承で何が間違っているのかについていくつかのヒントを持っています。私は最新のAPIで何か新しいことを忘れましたか?

ありがとうございました。

+0

Android 6.0以降では、このためにユーザーからの明示的な許可を求める必要があります。このチェックアウトの詳細を知るにはhttps://developer.android.com/guide/topics/permissions/requesting.html#normal-dangerous –

答えて

2

API 23まで、他の種類のアクセス許可に沿ってデバイスの外部ストレージにアクセスするには、マニフェストの権限で十分でした。 API 23からは、外部ストレージに書き込む権限など、実行時にユーザーが許可する必要があります。ここで

は、あなたがそれを行うことができる方法の例です:

private boolean checkWriteExternalPermission() { 

    String permission_read = Manifest.permission.READ_EXTERNAL_STORAGE; 
    String permission_write = Manifest.permission.WRITE_EXTERNAL_STORAGE; 
    int res = this.checkCallingOrSelfPermission(permission_read); 
    int res2 = this.checkCallingOrSelfPermission(permission_write); 
    return (res == PackageManager.PERMISSION_GRANTED && res2 == PackageManager.PERMISSION_GRANTED); 
} 

今、あなただけのようなあなたの方法にこれを適用する必要があります:はいファイルの読み書きが危険な権限として考えられている

if(checkWriteExternalPermission()){ 
    //do your logic with file writing/reading 
} else{ 
    //ask for user permissions 
    ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); 
} 
+0

Ricardoありがとうございますが、操作は外部ストレージではなくアプリケーションで行われますディレクトリ:/data/data/com.game.cheat/files – lolonapoli

+0

あなたのファイルが見つかりません - Androidで拒否されたアクセス許可が明示的である場合、実行時に> API 23で読み書きのアクセス権を尋ねる必要があります。 chmodまたはフォルダ/ファイルのアクセス許可に関連するその他のものが必要です – Ricardo

+0

XXXX_EXTERNAL_STORAGEは内部ストレージにも使用されていますか?それは即時ではありません。私は試してみます。 – lolonapoli

関連する問題