android中activity可以響應外部的action的例子(可以

ciscopuke發表於2021-09-09

效果:

圖片描述

如果使自己的應用也出現在這個列表上,必須在menifest的這個activity下加入:

<activity
    android:name=".export.ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <action android:name="android.intent.action.EDIT" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data android:mimeType="application/pdf" />
        <data android:mimeType="image/bmp" />
        <data android:mimeType="image/tiff" />
        <data android:mimeType="image/gif" />
        <data android:mimeType="image/jpeg" />
        <data android:mimeType="image/x-ms-bmp" />
        <data android:mimeType="image/png" />
        <data android:mimeType="image/x-pcx" />
        <data android:mimeType="image/targa" />
        <data android:mimeType="image/x-photoshop" />
        <data android:mimeType="text/plain" />
        <data android:mimeType="text/xml" />
        <data android:mimeType="text/html" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />

        <data
            android:host="*"
            android:mimeType="*/*"
            android:pathPattern=".*\.pdf"
            android:scheme="file" />

        <data
            android:host="*"
            android:mimeType="*/*"
            android:pathPattern=".*\.jpg"
            android:scheme="file" />

        <data
            android:host="*"
            android:mimeType="*/*"
            android:pathPattern=".*\.bmp"
            android:scheme="file" />
        <data
            android:host="*"
            android:mimeType="*/*"
            android:pathPattern=".*\.png"
            android:scheme="file" />

        <data
            android:host="*"
            android:mimeType="*/*"
            android:pathPattern=".*\.txt"
            android:scheme="file" />

    </intent-filter>
</activity>

然後在activity的oncreate上接收這個intent:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = this.getIntent();
    int flags = intent.getFlags();
    if ((flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
        if (intent.getAction() != null && Intent.ACTION_VIEW.equals(intent.getAction())) {
            if (SCHEME_FILE.equals(intent.getScheme()) || SCHEME_CONTENT.equals(intent.getScheme())) {

                String i_type = getIntent().getType();
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                mImportingUri = intent.getData();
                System.out.println("====mImportingUri=" + mImportingUri);

                InputStream is = null;
                try {
                    is = getContentResolver().openInputStream(mImportingUri);
                } catch (Exception e) {
                    System.out.println("====e=" + e);
                }

                if (mImportingUri != null && SCHEME_FILE.equalsIgnoreCase(mImportingUri.getScheme())) {
                    //Is file
                    startToCopyFile(is);
                } else if (mImportingUri != null && SCHEME_CONTENT.equalsIgnoreCase(mImportingUri.getScheme())) {
                    startCopyMedia(is);
                }

            }
        }
    }

}
private boolean startToCopyFile(InputStream is) {

    String fileName = getSDPath() + tmpPath + File.separator + getName(mImportingUri);
    makesureFileExist(fileName);
    File toFile = new File(fileName);
    CopyThread mCopyThread = new CopyThread(is, toFile);
    new Thread(mCopyThread).start();
    return true;
}


private class CopyThread implements Runnable {

    private File toFile;
    private InputStream fosfrom = null;


    public CopyThread(InputStream fosfrom, File toFile) {
        this.fosfrom = fosfrom;
        this.toFile = toFile;
    }

    @Override
    public void run() {
        try {
            TimeUnit.MILLISECONDS.sleep(800);

            FileInputStream fosfrom = null;
            if (this.fosfrom != null) {
                fosfrom = (FileInputStream) this.fosfrom;
            }
            FileOutputStream fosto = new FileOutputStream(toFile);
            byte bt[] = new byte[1024];
            int c;
            int time = 0;
            while ((c = fosfrom.read(bt)) > 0) {
                fosto.write(bt, 0, c);
            }
            if (fosfrom != null) {
                fosfrom.close();
            }
            fosto.close();

        } catch (Exception e) {
            return;
        } finally {
            try {
                if (this.fosfrom != null) {
                    this.fosfrom.close();
                }
            } catch (IOException e) {
            }
        }
    }
}

如果發現要匯入的檔案是txt格式,則我們在sd卡下建立一個tmp的資料夾,把這個檔案複製進去:

程式碼在:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4369/viewspace-2818944/,如需轉載,請註明出處,否則將追究法律責任。

相關文章