我创建了一个应用程序,因为我的标题提到我能够使用符号链接(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/