Я пытаюсь создать приложение android, которое копирует файл в другое приложение с помощью символической ссылки и печатает в центральных журналах Android - PullRequest
0 голосов
/ 17 марта 2020

Я создал приложение в качестве упоминания в заголовке. Мне удалось успешно создать ссылку на другой файл внутреннего приложения на мой файл app / data / data / myapp / с помощью символической ссылки, но когда я пытаюсь распечатать в журналах, это приводит к отказу в представлении .eacess

Mycode:

package myapp;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    [@Override](/override)
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String deepPath = ("/data/data/" + getPackageName()) + "/x/x/x/x/";
        new File(deepPath).mkdirs();
        try {
            new File(Uri.decode(deepPath + "..%2F..%2F..%2F..%2Fsdcard%2Ftest.xml")).getCanonicalFile().getParentFile().mkdirs();
            Runtime.getRuntime().exec("ln -s /data/data/anotherapp/file /data/data/myapp/test").waitFor();
            File f = new File("/data/data/myapp/test");
            f.setReadable(true);
            Intent intent = new Intent("android.intent.action.SEND");
            intent.setClassName("com.truecaller", "com.truecaller.messaging.sharing.SharingActivity");
            intent.putExtra("android.intent.extra.STREAM", Uri.parse("file:///data/data/myapp/test"));
            startActivity(intent);

            Log.d("MYAPP", MainActivity.getFileContents(f));
        } catch (Exception e) {
            e.printStackTrace();
            finish();
        }
    }

    public static String getFileContents(final File file) throws IOException {
        final InputStream inputStream = new FileInputStream(file);
        final BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

        final StringBuilder stringBuilder = new StringBuilder();

        boolean done = false;

        while (!done) {
            final String line = reader.readLine();
            done = (line == null);

            if (line != null) {
                stringBuilder.append(line);
            }
        }

        reader.close();
        inputStream.close();

        return stringBuilder.toString();
    }
}

Приведенный выше код создает файл, который уже находится в другом файле, и создает символическую ссылку на мою внутреннюю папку / data / data / myapp / file. но в то время как я пытаюсь распечатать этот файл в журнале, возникает отказ в разрешении

ошибка:

java.io.FileNotFoundException: /data/data/myapp/test: open failed: EACCES (Permission denied)
03-16 00:53:19.897  4231  4231 W System.err:    at libcore.io.IoBridge.open(IoBridge.java:452)
03-16 00:53:19.897  4231  4231 W System.err:    at java.io.FileInputStream.<init>(FileInputStream.java:76)
03-16 00:53:19.897  4231  4231 W System.err:    at com.mypackage.MainActivity.getFileContents(MainActivity.java:58)
03-16 00:53:19.897  4231  4231 W System.err:    at com.mypackage.MainActivity.onCreate(MainActivity.java:50)
03-16 00:53:19.897  4231  4231 W System.err:    at android.app.Activity.performCreate(Activity.java:6237)
03-16 00:53:19.897  4231  4231 W System.err:    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
03-16 00:53:19.897  4231  4231 W System.err:    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
03-16 00:53:19.897  4231  4231 W System.err:    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
03-16 00:53:19.897  4231  4231 W System.err:    at android.app.ActivityThread.-wrap11(ActivityThread.java)
03-16 00:53:19.897  4231  4231 W System.err:    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
03-16 00:53:19.897  4231  4231 W System.err:    at android.os.Handler.dispatchMessage(Handler.java:102)
03-16 00:53:19.897  4231  4231 W System.err:    at android.os.Looper.loop(Looper.java:148)
03-16 00:53:19.897  4231  4231 W System.err:    at android.app.ActivityThread.main(ActivityThread.java:5417)
03-16 00:53:19.897  4231  4231 W System.err:    at java.lang.reflect.Method.invoke(Native Method)
03-16 00:53:19.897  4231  4231 W System.err:    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
03-16 00:53:19.897  4231  4231 W System.err:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
03-16 00:53:19.897  4231  4231 W System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
03-16 00:53:19.897  4231  4231 W System.err:    at libcore.io.Posix.open(Native Method)
03-16 00:53:19.897  4231  4231 W System.err:    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
03-16 00:53:19.897  4231  4231 W System.err:    at libcore.io.IoBridge.open(IoBridge.java:438)
03-16 00:53:19.897  4231  4231 W System.err:    ... 15 more

исправьте мой код, и я должен напечатать этот файл в журнале. исправить мой код и вставить в ответ его очень ценится. спасибо

1 Ответ

0 голосов
/ 17 марта 2020

Пожалуйста, я дал вам правильный ответ 1 день go в { ссылка }:

Есть 2 вещи, которые вам нужно сделать, во-первых, проверить f.exists () if(!f.exists()) return;

Затем необходимо использовать new File(getExternalFilesDir(null), "path-to-your-file");

. Это должно безопасно создать ссылку на файл без отказа в разрешении.

Редактировать

Если вы хотите каталог данных, используйте getInternalFilesDir()

...