Ошибка сломанной трубы при захвате изображения в Android
Я собираюсь захватить изображение из приложения в Android, но есть некоторая проблема с выходным потоком, и есть ошибка с BROKEN PIPE с JAVA.IO. Мой код, если ниже. Вот проблема с функцией записи команды. Я скачал это демо с git hub, поэтому, пожалуйста, помогите мне как можно скорее. Заранее большое спасибо.
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());
}
}
3 ответа
Я думаю, что процесс, который вы выполнили, был прерван, поэтому OutputStream
больше не доступен, поэтому ошибка "Broken Pipe"
Я бы попробовал:
ProcessBuilder builder = new ProcessBuilder("/bin/bash");
builder.redirectErrorStream(true);
Process process = builder.start();
вместо того, чтобы звонить напрямую:
sh = Runtime.getRuntime().exec("su -c sh");
попробуй. Дай мне знать.
Может быть, вы можете получить хорошие идеи от:
На всякий случай... Вы проверили, что ваша карта памяти правильная? если вы используете Wi -Fi - связь хорошая?
Я думаю, что это проблема с доступом к хранилищу, вы должны просмотреть разрешение на использование и, возможно, вам следует использовать Environment.getExternalStorage.getPath для доступа в том месте, где вы хотите сохранить изображение.