2016-12-13 4 views
0

나는 누군가가 올바른 방향으로 나를 가리킬 수 있는지 궁금하지만 여기에 새로운입니다. 이것은 애셋에서 PDF 파일을 읽고 조각에 표시하려는 내 앱의 일부입니다. 안드로이드 버전은 PdfRenderer 행동에 영향을 미치는 지금 적어도 2 개의 다른 문제가있는 것 같습니다 23.4.0안드로이드 v23 PDFreader 계속 충돌

public class PDFFragment extends Fragment { 

private ParcelFileDescriptor fileDescriptor; 
private PdfRenderer pdfRenderer; 
private PdfRenderer.Page currentPage; 
private ImageView image; 
private Button buttonPrevious; 
private Button buttonNext; 

public PDFFragment() { 
    // Required empty public constructor 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_research_paper, container, false); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    // Retain view references. 
    image = (ImageView) view.findViewById(R.id.image); 
    buttonPrevious = (Button) view.findViewById(R.id.button_previous_research); 
    buttonNext = (Button) view.findViewById(R.id.button_next_research); 

    //set buttons event 
    buttonPrevious.setOnClickListener(onActionListener(-1)); //previous button clicked 
    buttonNext.setOnClickListener(onActionListener(1)); //next button clicked 

    int index = 0; 
    // If there is a savedInstanceState (screen orientations, etc.), we restore the page index. 
    if (null != savedInstanceState) { 
     index = savedInstanceState.getInt("current_page", 0); 
    } 
    showPage(index); 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     openRenderer(activity); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.i("Fragment", "Error occurred!"); 
     Log.e("Fragment", e.getMessage()); 
     activity.finish(); 
    } 
} 

@Override 
public void onDestroy() { 
    try { 
     closeRenderer(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    super.onDestroy(); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    if (null != currentPage) { 
     outState.putInt("current_page", currentPage.getIndex()); 
    } 
} 

//Create a PDF renderer 
private void openRenderer(Activity activity) throws IOException { 
    // Reading a PDF file from the assets directory. 
    fileDescriptor = activity.getAssets().openFd("research_paper.pdf").getParcelFileDescriptor(); 

    // This is the PdfRenderer we use to render the PDF. 
    pdfRenderer = new PdfRenderer(fileDescriptor); 
} 

//Closes PdfRenderer and related resources. 
private void closeRenderer() throws IOException { 
    if (null != currentPage) { 
     currentPage.close(); 
    } 
    pdfRenderer.close(); 
    fileDescriptor.close(); 
} 

//Shows the specified page of PDF file to screen 
private void showPage(int index) { 
    if (pdfRenderer.getPageCount() <= index) { 
     return; 
    } 
    // Make sure to close the current page before opening another one. 
    if (null != currentPage) { 
     currentPage.close(); 
    } 
    //open a specific page in PDF file 
    currentPage = pdfRenderer.openPage(index); 
    // Important: the destination bitmap must be ARGB (not RGB). 
    Bitmap bitmap = Bitmap.createBitmap(currentPage.getWidth(), currentPage.getHeight(), 
      Bitmap.Config.ARGB_8888); 
    // Here, we render the page onto the Bitmap. 
    currentPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); 
    // showing bitmap to an imageview 
    image.setImageBitmap(bitmap); 
    updateUIData(); 
} 

//Updates the state of 2 control buttons in response to the current page index. 
private void updateUIData() { 
    int index = currentPage.getIndex(); 
    int pageCount = pdfRenderer.getPageCount(); 
    buttonPrevious.setEnabled(0 != index); 
    buttonNext.setEnabled(index + 1 < pageCount); 
    getActivity().setTitle(getString(index + 1, pageCount)); 
} 

private View.OnClickListener onActionListener(final int i) { 
    return new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      if (i < 0) {//go to previous page 
       showPage(currentPage.getIndex() - 1); 
      } else { 
       showPage(currentPage.getIndex() + 1); 
      } 
     } 
    }; 
} 

}

로그 캣 오류 메시지

   java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.pdf.PdfRenderer.getPageCount()' on a null object reference 
        at com.example.PDFFragment.showPage(PDFFragment.java:115) 
        at com.example.PDFFragment.onViewCreated(PDFFragment.java:61) 
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086) 
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252) 
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742) 
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617) 
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517) 
        at android.os.Handler.handleCallback(Handler.java:739) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5417) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

getPageCount을() '다음과 같은 것을 사용했다 -> pdfRenderer가 null, "그것은 –

+0

당신이 buildToolsVersion으로 시도했던 25.0를 초기화 .1" ?? –

답변

1

을 사용했다.

처음 하나 (https://github.com/googlesamples/android-PdfRendererBasic에서 언급 된) 압축되지 PDF를 보장하기 위해 필요한 것 Gradle을 구성을 다음의 처리에 영향을 Gradle을 플러그인 (https://code.google.com/p/android/issues/detail?id=224273) 2.2의 버그에 관한 것이다. PdfRenderer은 찾을 수있는 ParcelFileDescriptor이 필요하므로 (파일을 압축 할 수 없음) 필수입니다. 2.2 버전의 gradle plugin을 사용하여 Google PdfRendererBasic 샘플로이 문제를 재현 할 수 있습니다. 이 문제를 해결하려면 플러그인 v2.1.2로 되돌려 야합니다.

android { 
    aaptOptions { 
     noCompress "pdf" 
    } 
} 

다른 문제

은 ( Android Studio - PDFRendererBasic - Unable to replace sample.pdf?이 문제에 대한 자세한 설명을 포함) PdfRendererBasic 샘플에서 발생하는 것 같다하지만, 다른 응용 프로그램에 (내 포함!) 및 APK의 포장과 관련이있을 것으로 보인다되지 않습니다.

마지막으로 링크 된 SO 문서의 한 제안은 raw 폴더에서 읽는 것이 었습니다. 그러나 이것은 어떤 이유로 나에게 적합하지 않았습니다. 내가 결국해야했던 것은 SD 카드에서 준비 PDF가 null 객체 참조에

String pdfPath = Environment.getExternalStorageDirectory() + "/sample.pdf"; 
    mFileDescriptor = ParcelFileDescriptor.open(new File(pdfPath), ParcelFileDescriptor.MODE_READ_ONLY); 

    // This is the PdfRenderer we use to render the PDF. 
    mPdfRenderer = new PdfRenderer(mFileDescriptor);