стековерфлауэрс,
Я делаю простой проект, используя Android-смартфоны для создания 3D-форм. Я использую Android Processing для создания простого приложения.
Мой код создает трехмерную форму и сохраняет ее в виде файла .STL. Он работает на моем ноутбуке и сохраняет файл .STL, но в приложении. версию, мне нужно сохранить ее на внешнее хранилище/SD-карту моего телефона (HTC Sensation). Это не так из-за того, как написана функция «сохранения» (writeSTL) в библиотеке обработки, которую я использую.
Я написал здесь для помощи (мой код более полный код здесь тоже):
... и Мариус Ватц, написавший библиотеку, говорит, что код writeSTL() в значительной степени автономен, и единственное, чего не хватает, это (или должно быть) замена кода, создающего поток вывода, который необходимо изменить для работы с Android. В основном, эта строка:
FileOutputStream out=(FileOutputStream)UIO.getOutputStream(p.sketchPath(filename));
Я не великий программист в том смысле, что обычно могу заставить Processing делать то, что мне нужно, но не более того; эта проблема меня избила. Я ищу идеи для правильного кода для замены строки:...
FileOutputStream out=(FileOutputStream)UIO.getOutputStream(p.sketchPath(filename));
... с чем-то «дружественным к Android». Вызов getExternalStorageDirectory() должен работать, но я не могу найти правильную структуру.
Код функции writeSTL приведен ниже.
import java.io.*;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
/**
* Output binary STL file of mesh geometry.
* @param p Reference to PApplet instance
* @param filename Name of file to save to
*/
public void customWriteSTL(UGeometry geo, PApplet p, String filename) {
byte [] header;
ByteBuffer buf;
UFace f;
try {
if (!filename.toLowerCase().endsWith("stl")) filename+=".stl";
FileOutputStream out=(FileOutputStream)UIO.getOutputStream(p.sketchPath(filename));
buf = ByteBuffer.allocate(200);
header=new byte[80];
buf.get(header, 0, 80);
out.write(header);
buf.rewind();
buf.order(ByteOrder.LITTLE_ENDIAN);
buf.putInt(geo.faceNum);
buf.rewind();
buf.get(header, 0, 4);
out.write(header, 0, 4);
buf.rewind();
UUtil.logDivider("Writing STL '"+filename+"' "+geo.faceNum);
buf.clear();
header=new byte[50];
if (geo.bb!=null) UUtil.log(geo.bb.toString());
for (int i=0; i<geo.faceNum; i++) {
f=geo.face[i];
if (f.n==null) f.calcNormal();
buf.rewind();
buf.putFloat(f.n.x);
buf.putFloat(f.n.y);
buf.putFloat(f.n.z);
for (int j=0; j<3; j++) {
buf.putFloat(f.v[j].x);
buf.putFloat(f.v[j].y);
buf.putFloat(f.v[j].z);
}
buf.rewind();
buf.get(header);
out.write(header);
}
out.flush();
out.close();
UUtil.log("Closing '"+filename+"'. "+geo.faceNum+" triangles written.\n");
}
catch (Exception e) {
e.printStackTrace();
}
}
Любые предложения принимаются с благодарностью.
Заранее спасибо.
p.sketchPath()
для использованияgetExternalStorageDirectory()
или еще лучшеgetExternalFilesDir()
. При условии, что.getOutputStream()
выберет полный путь. - person greenapps   schedule 29.06.2014FileOutputStream = new FileOutputStream(p.sketchPath(filename)):
. - person greenapps   schedule 29.06.2014