Ответ 1
Привет, ребята. После долгих размышлений и рассмотрения многих вариантов и обходных решений я думаю, что OliveDocLibrary - лучший способ сделать это. Вот ссылка которая даст вам прямую ссылку на страницу загрузки трех библиотек для Android, которые предназначены для DOC, XLS и PPT. Все это отлично работает. Папка пакета, которую вы загрузите, будет иметь три папки внутри. которые:
- API
- lib_trial
- Demo
В папке demo вы найдете образец проекта для Word. Вы можете напрямую импортировать этот проект в свое рабочее пространство в Eclipse и сами проверить код. Для удобства людей я размещаю этот код здесь. Я удалил часть кода, который, по моему мнению, не был необходим (w.r.t ответ на мой вопрос здесь). Таким образом, код имеет два файла. Основное действие - FileChooser
, которое выглядит следующим образом:
public class FileChooser extends Activity {
private String filePath = Environment.getExternalStorageDirectory()
.getPath() + "/simple.docx";
MyBaseAdapter adapter;
private static String parentPath;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(2);
copyFileToSdcard();
Intent intent = new Intent(FileChooser.this,
OliveWordTrailDemoAcitivy.class);
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.fromFile(new File(filePath)));
startActivity(intent);
}
class MyBaseAdapter extends BaseAdapter {
private String[] list;
public MyBaseAdapter(String[] list) {
this.list = list;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = new TextView(FileChooser.this);
((TextView) convertView).setTextSize(35);
}
((TextView) convertView).setText(list[position]);
return convertView;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public int getCount() {
return list.length;
}
public void setList(String[] list) {
this.list = list;
}
};
class MyItemClickListener implements OnItemClickListener {
String[] list;
InputStream is;
public MyItemClickListener(String[] list) {
this.list = list;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
File file = new File(parentPath + list[position]);
if (file.isFile()) {
Intent intent = new Intent(FileChooser.this,
OliveWordTrailDemoAcitivy.class);
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.fromFile(file));
startActivity(intent);
} else {
list = file.list();
adapter.setList(list);
adapter.notifyDataSetChanged();
parentPath = file.getAbsolutePath() + "/";
}
}
}
private void copyFileToSdcard() {
InputStream inputstream = getResources().openRawResource(
R.raw.simple);
byte[] buffer = new byte[1024];
int count = 0;
FileOutputStream fos = null;
try {
fos = new FileOutputStream(new File(filePath));
while ((count = inputstream.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
Toast.makeText(FileChooser.this, "Check your sdcard", Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Здесь я разместил файл doc с именем simple.docx, который содержит изображения и математические символы, которые отображаются и отображаются правильно. Эта активность взаимодействует с OliveWordTrialDemoActivity
, которая выглядит следующим образом:
public class OliveWordTrailDemoAcitivy extends Activity implements
OnClickListener, CommentListener, NoteListener, HyperlinkListener, ProgressListener {
OliveWordOperator viu;
EditText searchEditText;
ArrayList<String> bookmarks;
Handler handler;
protected void onCreate(Bundle savedInstanceState) {
viu = new OliveWordOperator(this, this);
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_PROGRESS);
setProgressBarVisibility(true);
getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);
setContentView(R.layout.demo_view);
OliveWordView view = (OliveWordView) findViewById(R.id.test_view);
try {
viu.init(view, getIntent().getData());
viu.start(viu.isEncrypted(), "111");
} catch (Exception e) {
e.printStackTrace();
}
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
setProgress(msg.what * 10);
super.handleMessage(msg);
}
};
}
@Override
protected void onDestroy() {
viu.release();
super.onDestroy();
}
@Override
public void getComment(ArrayList<String[]> comments) {
for (int i = 0; i < comments.size(); i++) {
AlertDialog.Builder builder = new Builder(this);
builder.setTitle(comments.get(i)[0]).setMessage(comments.get(i)[1])
.show();
}
}
@Override
public void getHyperlink(String hyperlink) {
if (Uri.parse(hyperlink).getScheme().contains("mailto")) {
try {
startActivity(new Intent(Intent.ACTION_SENDTO,
Uri.parse(hyperlink)));
} catch (ActivityNotFoundException anfe) {
Toast.makeText(this, "can't found email application",
Toast.LENGTH_SHORT).show();
}
} else {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(hyperlink)));
}
}
@Override
public void getNote(SparseArray<String> notes) {
for (int i = 0; i < notes.size(); i++) {
AlertDialog.Builder builder = new Builder(this);
if (notes.keyAt(i) == NoteListener.FOOTNOTE) {
builder.setTitle("footnote").setMessage(notes.valueAt(i))
.show();
} else if (notes.keyAt(i) == NoteListener.ENDNOTE) {
builder.setTitle("endnote").setMessage(notes.valueAt(i)).show();
}
}
}
public void goToBookmarks(String name) {
viu.goToBookmark(name);
}
public void listBookmarks() {
this.bookmarks = viu.listBookmarks();
}
@Override
public void notifyProgress(int progress) {
handler.sendEmptyMessage(progress);
}
@Override
public void onClick(View v) {
}
}
В папке lib_trial вы найдете библиотеку, которая может быть добавлена в вашу папку libs, если вы хотите использовать ее отдельно.
И в папке API вы найдете подробное описание библиотеки и ее методы в виде pdf файла, который очень легко понять. поэтому люди могут просто использовать эту библиотеку напрямую и использовать методы, предусмотренные их конкретным требованием.
Итак, решение на данный момент продолжается. Любые лучшие решения приветствуются. Время награды скоро закончится, поэтому, пожалуйста, предоставьте любое другое решение, которое у вас может быть как можно скорее. Спасибо.