java - 我正在尝试创建一个 Android 应用程序,它使用符号链接(symbolic link)在另一个应用程序中复制文件并在中央 Android 日志中打印

标签 java android debugging kotlin adb

我创建了一个应用程序,因为我的标题提到我能够使用符号链接(symbolic link)成功创建另一个应用程序内部文件到我的应用程序/data/data/myapp/file 的链接,但是当我尝试在日志中打印时,它给出了权限被拒绝.eaccess

我的代码:

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 的符号链接(symbolic link)。但是当我尝试在日志中打印该文件时,发生权限被拒绝

错误:

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天前在https://stackoverflow.com/a/60702957/13065380给了你正确的答案:

你需要做两件事,首先,检查 f.exists() if(!f.exists()) return;

然后,您需要使用new File(getExternalFilesDir(null), "path-to-your-file");

这应该安全地创建文件的链接,而不会拒绝权限。

编辑

如果您想要数据目录,请使用getInternalFilesDir()

关于java - 我正在尝试创建一个 Android 应用程序,它使用符号链接(symbolic link)在另一个应用程序中复制文件并在中央 Android 日志中打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60715928/

相关文章:

java - 为什么Eclipse调试器会莫名其妙的报错 "Source not found"?

python - Pycharm调试器无法启动: finished with exit code -1073741819 (0xC0000005)

java - 删除 class= 属性

android - 如何在ListView中添加一个有四个选项的项目?

Android:读取/写入 ZipInputStream 的更快方法?

android - RecyclerView.OnItemClickListener 与在 RecyclerView 的查看器中实现 onClickListener?

通过运行时对象与任务管理器输出 Java 内存使用情况

java - SSL CA证书安装

java - 滑动选项卡时更改菜单项

winapi - 在 Windows 7 中成功 SuspendThread 后 GetThreadContext 失败