web-dev-qa-db-fra.com

Android: échec de l'écriture: EPIPE (canal cassé) Erreur lors de l'écriture du fichier

J'essayais de faire une capture d'écran de l'écran Android par programme. J'ai fait le code suivant:

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)

S'il vous plaît quelqu'un peut-il aider? J'avais déjà vérifié les autres messages et je ne trouvais rien qui résolve mon problème.


MODIFIER:

Veuillez noter que l'erreur se produit dans la ligne os.write().

15

Le problème EPIPE se produit généralement lorsque vous essayez d'exécuter une commande nécessitant des autorisations root (getRuntime().exec) dans votre cas sur le périphérique sans celui-ci, ou que vous exécutez plusieurs commandes root simultanément. Si vous travaillez sur l'émulateur et que vous avez besoin de le rooter, je pense que vous pouvez essayer pendant que l'émulateur est en cours d'exécution:

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

Ici http://abd-tech.blogspot.com/2011/05/test-root-apps-on-Android-emulator.html plus d'explications détaillées.

10
Oleksandr Karaberov

Le problème est que votre application ne dispose pas des autorisations système pour accéder à la surface (qui utilise un tampon d'écran et un décodeur hw pour restituer votre fichier vidéo) . Pour obtenir ces autorisations, vous devez créer (et signer) votre application. en tant qu'application système et localisez-la dans le dossier system/priv-app . De plus, vous devez ajouter l'autorisation suivante à cette application système:

<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">

notez les parties coreApp="true" Android:sharedUserId="Android.uid.media".

et vous devrez ajouter la permission <uses-permission Android:name="Android.permission.ACCESS_SURFACE_FLINGER" />.

veuillez aussi commander ceci: Refus de permission: Impossible d'accéder à SurfaceFlinger

0
benchuk