Ich habe versucht, programmgesteuert einen Screenshot des Android-Bildschirms zu machen. Ich hatte den folgenden Code gemacht:
private void getsnap(){
try{
Process sh = Runtime.getRuntime().exec("su", null, null);
OutputStream os = sh.getOutputStream();
String filePath = this.getFilesDir().getPath().toString() + "/fileName1.jpeg";
os.write(("/system/bin/screencap -p " + filePath).getBytes("ASCII"));
os.flush();
os.close();
sh.waitFor();
}
catch (Exception e)
{
e.printStackTrace();
}
}
Java.io.IOException: write failed: EPIPE (Broken pipe)
Kann bitte jemand helfen? Ich hatte bereits die anderen Beiträge überprüft und finde keine Lösung für mein Problem.
BEARBEITEN:
Bitte beachten Sie, dass der Fehler in der Zeile os.write()
auftritt.
Das EPIPE-Problem tritt normalerweise auf, wenn Sie versuchen, einen Befehl auszuführen, der in Ihrem Fall root-Berechtigungen (getRuntime().exec
) auf dem Gerät ohne diesen Befehl benötigt, oder mehrere Root-Befehle gleichzeitig auszuführen. Wenn Sie an dem Emulator arbeiten und ihn rooten müssen, denke ich, können Sie dies versuchen, während der Emulator läuft:
adb Shell mount -o rw,remount -t yaffs2 /dev/block/mtdblock03 /system
adb Push su /system/xbin/su
adb Shell chmod 06755 /system
adb Shell chmod 06755 /system/xbin/su
Hier http://abd-tech.blogspot.com/2011/05/test-root-apps-on-Android-emulator.html nähere Erklärung.
Das Problem ist, dass Ihre App über keine Systemberechtigungen für den Zugriff auf den Oberflächenflinger verfügt (der Bildschirmpuffer und den HD-Decoder zum Rendern Ihrer Videodatei verwendet). Um diese Berechtigungen zu erhalten, müssen Sie Ihre App erstellen (und signieren) als System-App und suchen Sie sie im Ordner system/priv-app ..__ Zusätzlich müssen Sie dieser System-App die folgenden Berechtigungen hinzufügen:
<manifest package="com.yourapp.demo"
Android:versionCode="1"
coreApp="true"
Android:sharedUserId="Android.uid.media"
Android:versionName="1.0" xmlns:Android="http://schemas.Android.com/apk/res/Android">
beachten Sie die coreApp="true"
Android:sharedUserId="Android.uid.media"
-Teile.
und Sie müssen die <uses-permission Android:name="Android.permission.ACCESS_SURFACE_FLINGER" />
-Berechtigung hinzufügen.
bitte überprüfen Sie auch dies: Berechtigungsverweigerung: Zugriff auf den SurfaceFlinger nicht möglich