2013-04-03 9 views
14

ja zamierzam zrobić zdjęcie, które jest z aplikacji na Android, ale jest jakiś problem ze strumieniem Output i występuje błąd z uszkodzenia rurociągów z java.io . Mój kod, jeśli poniżej. Oto problem z funkcją polecenia zapisu. Pobrałem to demo z git hub, więc proszę pomóżcie mi jak najszybciej. Z góry dziękuję.błąd rura złamany podczas przechwytywania obrazu w 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()); 
    } 

} 

Odpowiedz

1

myślę proces wy wykonany został zakończony, więc OutputStream już nie jest dostępny, więc „Broken pipe” błąd.

chciałbym spróbować:

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

zamiast dzwonić bezpośrednio:

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

spróbować. Daj mi znać.

Może masz jakieś dobre pomysły:

Java Process with Input/Output Stream

+0

java.io.IOException: Błąd przy uruchomieniu exec(). Polecenie: [/ bin/bash] Katalog roboczy: null Środowisko: [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

Użyłem twojego kodu, ale utworzyłem górny logcat –

0

na wszelki wypadek ... Czy sprawdzić, czy karta pamięci jest poprawna? jeśli używasz wifi - Połączenie jest dobre?

0

Myślę, że jest problem z dostępem do pamięci masowej, należy zapoznać się z uprawnieniami do używania i być może należy użyć środowiska Environment.getExternalStorage.getPath , aby uzyskać dostęp w miejscu, w którym chcesz zapisać obraz.

Powiązane problemy