2013-04-03 1 views
14

sto per catturare un'immagine che è da un'applicazione in Android, ma c'è qualche problema con Stream uscita e c'è un errore con tubo rotto con JAVA.IO . Il mio codice se di seguito. Ecco il problema con la funzione di comando di scrittura. Ho scaricato questa demo da git hub, quindi per favore aiutami il prima possibile. Grazie mille in anticipo.errore tubo rotto durante l'acquisizione dell'immagine in android

void takeScreenshot() 
{ 
    String file ="/data/data/com.koushikdutta.screenshot/screenshot.bmp";; 
    OutputStream os = null; 
    int screenshotUid; 
    String screenshotUser = null; 
    Process sh = null; 
    try 
    { 
     try 
     { 
      sh = Runtime.getRuntime().exec("su -c sh"); 

      os = sh.getOutputStream(); 
      Log.e("","THE VALUE OF OBJECT IS:::::"+os.toString()); 

      // file ="/data/data/com.koushikdutta.screenshot/screenshot.bmp"; 
      screenshotUid = getUidForPackage("com.koushikdutta.screenshot"); 
      screenshotUser = getUserForPackage("com.koushikdutta.screenshot"); 
     } 
     catch(Exception e) 
     { 
      Log.e("","Hi Error created"); 
     } 
     try 
     { 
      Thread.sleep(2000); 
      writeCommand(os, "rm "+file); 
      writeCommand(os, "mkdir /sdcard/dcim"); 

     } 
     catch(Exception e) 
     { 
      Log.e("","Hello How are you??"+e.getMessage()); 
     } 
     writeCommand(os, "mkdir /sdcard/dcim/Screenshot"); 
     writeCommand(os, "/data/data/com.koushikdutta.screenshot/screenshot"); 
     writeCommand(os, "chown root." + screenshotUser + " " + file); 
     writeCommand(os, "chmod 660 " + file); 
     writeCommand(os, "exit"); 
     os.flush(); 
     os.close(); 
     boolean success = false; 
     for (int i = 0; i < 10; i++) 
     { 
      try 
      { 
       Thread.sleep(1000); 
       // if we can successfully get the exit value, 
       // then that means the process exited. 
       sh.exitValue(); 
       success = true; 
       break; 
      } 
      catch (Exception ex) 
      { 
       Log.e("","Error while"+ex.getMessage()); 
      } 
     } 
     try 
     { 
      if (!success) 
       throw new Exception("Unable to take screenshot"); 

      File screenshot = new File(file); 
      if (!screenshot.exists()) 
       throw new Exception("screenshot.raw file not found!"); 

      mHander.post(new Runnable() 
      { 
       public void run() 
       { 
        Toast toast = Toast.makeText(
         ScreenshotActivity.this, 
         "Screen captured!", Toast.LENGTH_LONG); 
        toast.show(); 
       } 
      }); 
     } 
     catch(Exception e) 
     { 
      Log.e("","ERROR CREATING......."+e.getMessage()); 
     } 

     try 
     { 
      FileInputStream fs = new FileInputStream(file); 
      mBitmap = BitmapFactory.decodeStream(fs); 
      mScreenshotFile = String.format(
         "/sdcard/dcim/Screenshot/screenshot%d.png", 
         System.currentTimeMillis()); 
      FileOutputStream fout = new FileOutputStream(mScreenshotFile); 
      mBitmap.compress(CompressFormat.PNG, 100, fout); 
      fout.close(); 
      mConnection.scanFile(mScreenshotFile, null); 
     } 
     catch (Exception ex) 
     { 
      Log.e("","Error while"+ex.getMessage()); 
     } 

     mHander.post(new Runnable() 
     { 
      public void run() 
      { 
       mImage.setImageBitmap(mBitmap); 
      } 
     }); 
    } 
    catch (Exception ex) 
    { 
     Toast toast = Toast.makeText(
         ScreenshotActivity.this, "Error: " + ex.getMessage(), 
         Toast.LENGTH_LONG); 
     toast.show(); 
     Log.e("",""+ "Error: " + ex.getMessage()); 
    } 
} 

    static void writeCommand(final OutputStream os, String command) 
    { 

     try 
    { 
     os.write((command+"\n").getBytes("ASCII")); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
     Log.e("","Error was::::::::::::::::::"+e.getMessage()); 
    } 

} 

risposta

1

penso che il processo si eseguisse è stato terminato, in modo che il OutputStream non è più disponibile, quindi l'errore "Broken Pipe".

vorrei provare:

ProcessBuilder builder = new ProcessBuilder("/bin/bash"); 
builder.redirectErrorStream(true); 
Process process = builder.start(); 

invece di chiamare direttamente:

sh = Runtime.getRuntime().exec("su -c sh"); 

fare un tentativo. Fammi sapere.

forse è possibile ottenere alcune buone idee da:

Java Process with Input/Output Stream

+0

java.io.IOException: errore nell'esecuzione exec(). Comando: [/ bin/bash] Directory di lavoro: null Ambiente: [ANDROID_SOCKET_zygote = 10, ANDROID_BOOTLOGO = 1, EXTERNAL_STORAGE =/mnt/sdcard, ANDROID_ASSETS =/system/app, ASEC_MOUNTPOINT =/mnt/asec, PATH =/sbin:/system/sbin:/system/bin:/system/xbin, ANDROID_DATA =/data, BOOTCLASSPATH =/system/framework/core.jar: /system/framework/ext.jar: /system/framework/framework.jar:/system /framework/android.policy.jar:/system/framework/services.jar, ANDROID_PROPERTY_WORKSPACE = 9,32768, ANDROID_ROOT =/system, LD_LIBRARY_PATH =/system/lib] –

+0

ho usato il tuo codice ma ha creato logcat superiore –

0

Solo nel caso ... Hai controllato che la scheda di memoria è corretta? se si utilizza la connessione wifi - La connessione è buona?

0

Penso che sia un problema con l'accesso all'archiviazione dovresti rivedere l'autorizzazione-usi e forse dovresti usare l'Environment.getExternalStorage.getPath per accedere al luogo in cui vuoi salvare l'immagine.