Java 如何使用startActivityForResult意图选择PDF文件并在第二个类中返回结果
我对android编程比较陌生,我想创建一个pdf阅读器,调用内置的文件管理器来选择pdf文件,然后在第二个类中显示pdf文件。这是我的代码到目前为止仍然有问题,我认为第二个活动无法获得选定的pdf文件,我无法修复此错误Java 如何使用startActivityForResult意图选择PDF文件并在第二个类中返回结果,java,android,Java,Android,我对android编程比较陌生,我想创建一个pdf阅读器,调用内置的文件管理器来选择pdf文件,然后在第二个类中显示pdf文件。这是我的代码到目前为止仍然有问题,我认为第二个活动无法获得选定的pdf文件,我无法修复此错误 MainActivity package com.example.user.projectapp; import android.app.Activity; import android.app.ListActivity;
MainActivity
package com.example.user.projectapp;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.OpenableColumns;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MainActivity extends AppCompatActivity {
public static String path;
private static final int PICKFILE_REQUEST_CODE = 0;
File tempFile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getFile();
}
public void getFile() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("application/pdf");
path = intent.getStringExtra("path");
intent.putExtra("path",path);
startActivityForResult(intent, PICKFILE_REQUEST_CODE);
}
Second Activity
package com.example.user.projectapp;
import android.annotation.TargetApi;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.pdf.PdfRenderer;
import android.os.Build;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.io.File;
public class Main2Activity extends AppCompatActivity {
int pagecount = -1;
Button buttonnext, buttonprevious;
ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
buttonnext = (Button) findViewById(R.id.button1);
buttonprevious = (Button) findViewById(R.id.button2);
imageView = (ImageView) findViewById(R.id.imageview);
buttonnext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
pagecount++;
render();
}
});
buttonprevious.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
pagecount--;
render();
}
});
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void render() {
try {
int width = imageView.getWidth();
int height = imageView.getHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);
Intent intent = getIntent();
String data = intent.getStringExtra("path");
File file = new File(data);
PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY));
if (pagecount < 0) {
pagecount = 0;
} else if (pagecount > renderer.getPageCount()) {
pagecount = renderer.getPageCount() - 1;
}
renderer.openPage(pagecount).render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
imageView.setImageBitmap(bitmap);
imageView.invalidate();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}
}
是的。。因为你的路径是空的。。这就是您获得空指针异常的原因。使用下面的代码,它不会给您错误: 主要活动
import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.OpenableColumns;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MainActivity extends AppCompatActivity {
public static String path;
private static final int PICKFILE_REQUEST_CODE = 0;
File tempFile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getFile();
}
public void getFile() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
//intent.setType("application/pdf");
// path = intent.getStringExtra("path");
// intent = new Intent(this, Main2Activity.class);
// intent.putExtra("path", path);
startActivityForResult(intent, PICKFILE_REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==PICKFILE_REQUEST_CODE && resultCode==RESULT_OK) {
Intent intent = new Intent(this, Main2Activity.class);
Uri uri = data.getData();
String uriString = uri.toString();
File myFile = new File(uriString);
path = myFile.getAbsolutePath();
Log.d("uri",uriString + " " + path);
Bundle extras = new Bundle();
extras.putParcelable("path", uri);
// intent.putExtra();
startActivityForResult(intent, PICKFILE_REQUEST_CODE);
}
super.onActivityResult(requestCode, resultCode, data);
}
}
主要活动
import android.annotation.TargetApi;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.pdf.PdfRenderer;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.io.File;
public class Main2Activity extends AppCompatActivity {
int pagecount = -1;
Button buttonnext, buttonprevious;
ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
buttonnext = (Button) findViewById(R.id.button1);
buttonprevious = (Button) findViewById(R.id.button2);
imageView = (ImageView) findViewById(R.id.imageview);
buttonnext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
pagecount++;
render();
}
});
buttonprevious.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
pagecount--;
render();
}
});
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void render() {
try {
int width = imageView.getWidth();
int height = imageView.getHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);
Intent intent = getIntent();
Bundle extras = intent.getExtras();
Uri data = extras.getParcelable("path");
Log.d("Soanam","path" + data);
File file = new File(data.toString());
PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY));
if (pagecount < 0) {
pagecount = 0;
} else if (pagecount > renderer.getPageCount()) {
pagecount = renderer.getPageCount() - 1;
}
renderer.openPage(pagecount).render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
imageView.setImageBitmap(bitmap);
imageView.invalidate();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}
}
导入android.annotation.TargetApi;
导入android.content.Intent;
导入android.graphics.Bitmap;
导入android.graphics.pdf.PdfRenderer;
导入android.net.Uri;
导入android.os.Build;
导入android.os.Environment;
导入android.os.ParcelFileDescriptor;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.Button;
导入android.widget.ImageView;
导入java.io.File;
公共类Main2活动扩展了AppCompative活动{
int pagecount=-1;
按钮按钮下,按钮上;
图像视图图像视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
buttonnext=(按钮)findViewById(R.id.button1);
buttonprevious=(按钮)findViewById(R.id.button2);
imageView=(imageView)findViewById(R.id.imageView);
buttonnext.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
pagecount++;
render();
}
});
buttonprevious.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
页面计数--;
render();
}
});
}
@TargetApi(Build.VERSION\u code.LOLLIPOP)
公共无效呈现(){
试一试{
int width=imageView.getWidth();
int height=imageView.getHeight();
位图Bitmap=Bitmap.createBitmap(宽度、高度、Bitmap.Config.ARGB_4444);
Intent=getIntent();
Bundle extras=intent.getExtras();
Uri data=extras.getParcelable(“路径”);
Log.d(“Soanam”、“路径”+数据);
File File=新文件(data.toString());
PdfRenderer renderer=newpdfrenderer(ParcelFileDescriptor.open(文件,ParcelFileDescriptor.MODE_只读));
如果(页面计数<0){
页面计数=0;
}else if(pagecount>renderer.getPageCount()){
pagecount=renderer.getPageCount()-1;
}
renderer.openPage(pagecount).render(位图、null、null、PdfRenderer.Page.render\u模式用于显示);
设置图像位图(位图);
imageView.invalidate();
}捕获(例外e){
e、 printStackTrace();
}
}
@凌驾
public void onBackPressed(){
super.onBackPressed();
意向意向=新意向(此,MainActivity.class);
星触觉(意向);
}
}
所以你有问题。有意思。你能帮忙解决吗?解决什么问题?描述没有问题。没有问题。你仍然不明白你需要先写一篇像样的文章吗?我已经编辑了这篇文章,谢谢。在你编辑完之后,你需要告诉我们你的日志中报告了哪个大问题。我如何解决这个问题?请粘贴MainActivity.java的完整代码。。它丢失了根据您的要求修改它完全按照上面粘贴的方式运行它我仍然得到了:03-29 10:18:22.602 10094-10094/com.example.user.mpdfreader W/System.err:java.lang.nullpointer异常:尝试调用虚拟方法'android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String)'在空对象引用03-29 10:18:22.603 10094-10094/com.example.user.mpdfreader W/System.err:at com.example.user.mpdfreader.Main2Activity.render(Main2Activity.java:65)上,似乎在OnActivityResult上未接收到所选文件。您是否获得了任何文件选择UI?我找到了,工作正常,并选择了一个pdf文件,启动了第二项活动。但无法读取选定的文件。
03-29 11:32:47.276 21674-21674/com.example.user.newtry W/System.err: java.io.FileNotFoundException: No such file or directory
03-29 11:32:47.283 21674-21674/com.example.user.newtry W/System.err: at android.os.Parcel.openFileDescriptor(Native Method)
03-29 11:32:47.283 21674-21674/com.example.user.newtry W/System.err: at android.os.ParcelFileDescriptor.openInternal(ParcelFileDescriptor.java:253)
03-29 11:32:47.283 21674-21674/com.example.user.newtry W/System.err: at android.os.ParcelFileDescriptor.open(ParcelFileDescriptor.java:199)
import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.OpenableColumns;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MainActivity extends AppCompatActivity {
public static String path;
private static final int PICKFILE_REQUEST_CODE = 0;
File tempFile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getFile();
}
public void getFile() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
//intent.setType("application/pdf");
// path = intent.getStringExtra("path");
// intent = new Intent(this, Main2Activity.class);
// intent.putExtra("path", path);
startActivityForResult(intent, PICKFILE_REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==PICKFILE_REQUEST_CODE && resultCode==RESULT_OK) {
Intent intent = new Intent(this, Main2Activity.class);
Uri uri = data.getData();
String uriString = uri.toString();
File myFile = new File(uriString);
path = myFile.getAbsolutePath();
Log.d("uri",uriString + " " + path);
Bundle extras = new Bundle();
extras.putParcelable("path", uri);
// intent.putExtra();
startActivityForResult(intent, PICKFILE_REQUEST_CODE);
}
super.onActivityResult(requestCode, resultCode, data);
}
}
import android.annotation.TargetApi;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.pdf.PdfRenderer;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.io.File;
public class Main2Activity extends AppCompatActivity {
int pagecount = -1;
Button buttonnext, buttonprevious;
ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
buttonnext = (Button) findViewById(R.id.button1);
buttonprevious = (Button) findViewById(R.id.button2);
imageView = (ImageView) findViewById(R.id.imageview);
buttonnext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
pagecount++;
render();
}
});
buttonprevious.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
pagecount--;
render();
}
});
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void render() {
try {
int width = imageView.getWidth();
int height = imageView.getHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);
Intent intent = getIntent();
Bundle extras = intent.getExtras();
Uri data = extras.getParcelable("path");
Log.d("Soanam","path" + data);
File file = new File(data.toString());
PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY));
if (pagecount < 0) {
pagecount = 0;
} else if (pagecount > renderer.getPageCount()) {
pagecount = renderer.getPageCount() - 1;
}
renderer.openPage(pagecount).render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
imageView.setImageBitmap(bitmap);
imageView.invalidate();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}
}