0

Android の初心者です。研修生として、PDF ファイルを開いて読み取るための Android アプリを作成しようとしています。次に、目標は、電子メールで送信しデジタル署名できるようにすることです。今のところ、ボタンを押してファイルを開くだけです。今、私のアプリケーションが起動されました! かわいい「開く」ボタンが表示されます。それをクリックすると、次のようになります。

URL を開けません

うーん...私はいくつかのことuriを試してみ ました.

私を助けるためのアイデアはありますか? (私のアプリの使用には何かがあります!)

ここに私のコードがあります:

マニフェスト

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.pdfsigner"
      android:versionCode="1"
      android:versionName="1.0">

    <!--Limites de la version SDK -->
    <uses-sdk android:minSdkVersion="7"
        android:targetSdkVersion="7" />

    <!-- autorisation Internet -->
    <uses-permission android:name="android.permission.INTERNET" />

    <application 
        android:icon="@drawable/ic_launcher" 
        android:label="@string/app_name">        
        <activity android:name=".PdfActivity"
                  android:label="@string/app_name">                  
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
        </activity>
    </application>
</manifest>

PdfActivity.java

package com.example.pdfsigner;

import com.example.pdfsigner.R;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class PdfActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activitymain);

        //applicat° du Listener click/button1
        Button b1 = (Button)findViewById( R.id.button1 );
        b1.setOnClickListener( new OnClickListener() {

  //au click...         
  @Override
  public void onClick(View arg0) {
  String surl = "/ENGLISH.pdf";
  String apptype = "PdfSigner/pdf";
  if( openURLWithType( surl, apptype ) == false)
          Toast.makeText( PdfActivity.this, 
       "Echec de Open URL", Toast.LENGTH_LONG ).show();
                }
            }
        );
    }

    public boolean openURLWithType( String url, String type ) { 

        Uri uri = Uri.parse("android.resource://" + getPackageName() + "/R.raw.ENGLISH");

        Intent intent = new Intent( Intent.ACTION_VIEW, uri );
        intent.setDataAndType( uri, type );
        intent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );

        try {
                PdfActivity.this.startActivity(intent);
                return true;
        }
        catch (ActivityNotFoundException e) {
                Log.e( "LTM" ,"Activity not found: " + url, e);
        }
        return false;
    }
}

activitymain.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".PdfActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="168dp"
        android:text="@string/Ouvrir" />
</RelativeLayout>

ログキャット

06-13 17:33:46.402: E/LTM(17317): Activity not found: /ENGLISH.pdf 06-13 17:33:46.402:                    E/LTM(17317):
android.content.ActivityNotFoundException: No Activity found to handle
Intent { act=android.intent.action.VIEW
dat=android.resource://com.example.pdfsigner/R.raw.ENGLISH
typ=PdfSigner/pdf flg=0x4000000 } 06-13 17:33:46.402: E/LTM(17317):
    at
android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1638)
06-13 17:33:46.402: E/LTM(17317):   at
android.app.Instrumentation.execStartActivity(Instrumentation.java:1510)
06-13 17:33:46.402: E/LTM(17317):   at
android.app.Activity.startActivityForResult(Activity.java:3258) 06-13
17:33:46.402: E/LTM(17317):     at
android.app.Activity.startActivity(Activity.java:3365) 06-13
17:33:46.402: E/LTM(17317):     at
com.example.pdfsigner.PdfActivity.openURLWithType(PdfActivity.java:48)
06-13 17:33:46.402: E/LTM(17317):   at
com.example.pdfsigner.PdfActivity$1.onClick(PdfActivity.java:31) 06-13
17:33:46.402: E/LTM(17317):     at
android.view.View.performClick(View.java:3538) 06-13 17:33:46.402:
E/LTM(17317):   at android.view.View$PerformClick.run(View.java:14330)
06-13 17:33:46.402: E/LTM(17317):   at
android.os.Handler.handleCallback(Handler.java:608) 06-13
17:33:46.402: E/LTM(17317):     at
android.os.Handler.dispatchMessage(Handler.java:92) 06-13
17:33:46.402: E/LTM(17317):     at
android.os.Looper.loop(Looper.java:156) 06-13 17:33:46.402:
E/LTM(17317):   at
android.app.ActivityThread.main(ActivityThread.java:4987) 06-13
17:33:46.402: E/LTM(17317):     at
java.lang.reflect.Method.invokeNative(Native Method) 06-13
17:33:46.402: E/LTM(17317):     at
java.lang.reflect.Method.invoke(Method.java:511) 06-13 17:33:46.402:
E/LTM(17317):   at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-13 17:33:46.402: E/LTM(17317):   at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 06-13
17:33:46.402: E/LTM(17317):     at dalvik.system.NativeStart.main(Native
Method) 06-13 17:33:49.915: D/memalloc(17317): /dev/pmem: Unmapping
buffer base:0x4ca72000 size:3694592 offset:3645440

ありがとう!

4

2 に答える 2

1

電子メールから PDF ファイルを送信する場合は、ここを参照してくださいAndroid インテント: 添付ファイル付きの電子メールを送信します

この Q は uri を理解するのに役立ちます URI、URL、URN の違いは何ですか?

ここでは、BROWSE ボタンを作成する方法を説明します。これをクリックすると、SDCARD が開き、ファイルを選択すると、選択したファイルのファイル名とファイル パスが取得されます。Log.dメソッドを使用できるURIアドレスを見つけるには(最後の回答に移動します)

一般的な構造は次のようになります。

File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/example.pdf");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file),”application/pdf”);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
于 2013-06-13T23:34:47.043 に答える
0

したがって、最初の問題は、生のリソース フォルダー内のファイルを開くように別のアプリに要求していることです。セキュリティ上の理由から、これは不可能です。受信アプリ (この場合は Adob​​e Reader) では、ファイルが保護されていない場所にある必要があります。それを外部のパブリック ストレージ領域にコピーしてから、コピーしたファイルでインテントを開くことができます。ファイルが存在しない場合にのみ、UI スレッドでコピーを行うべきではなく、毎回行うべきではないことに注意してください。

2 つ目の問題は、インテントの MIME タイプを指定していないことです。必ず「application/pdf」に設定してください。

private void openPDF() {
    final InputStream in = getResources().openRawResource(R.raw.english);
    new AsyncTask<Void, Void, Void> () {
        File outDir = new File(Environment.getExternalStorageDirectory() + "/" + getPackageName() + "/.temp");
        File outFile = new File(outDir, "english.pdf");
        @Override
        protected void onPostExecute(Void result) {
            Uri uri = Uri.fromFile(outFile);
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(uri, "application/pdf");
            startActivity(intent);
        }
        @Override
        protected Void doInBackground(Void... params) {
            if (!outFile.exists()) {
                outDir.mkdirs();
                OutputStream out;
                try {
                    out = new FileOutputStream(outFile);
                    copyPDF(in, out);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
    }.execute();

}
private void copyPDF(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while((read = in.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
}
于 2013-06-14T17:49:18.937 に答える