AndroidのContentProviderによるファイル共有

4826 ワード

ContentProviderを使用してファイルを共有する場合は、openFileメソッドを書き換える必要があります.そうしないと、例外が表示されます.
次のようになります.
public class ContentProviderDemo extends ContentProvider {

    @Override
    public ParcelFileDescriptor openFile(Uri uri, String mode)
            throws FileNotFoundException {
        //           ,        data/data/      
        String path = getContext().getFilesDir().getParent();
        File file = new File(path, uri.getPath().substring(1));
        // ParcelFileDescriptor.MODE_READ_ONLY:   
        // ParcelFileDescriptor.MODE_WRITE_ONLY:   
        // ParcelFileDescriptor.MODE_READ_WRITE:    
        return ParcelFileDescriptor.open(file,
                ParcelFileDescriptor.MODE_READ_ONLY);

    }

    ...

}

uri=content://jobdispatcher/abc.txtの場合、uri.getPathとuri.getEncodedPathはともに「/abc.txt」であり、特に「/」が含まれていることに注意してください.
登録:


例:providerを提供するAPP Aは、指向性放送を送信することにより、指定したAPP Bに共有ファイルのuriを送信し、その指向性放送を受信したAPP Aはuriを介してファイルを解析する.
ブロードキャスト:
String RECEIVE_MSG_ACTION = "com.example.sspreceiver.msg_action";

Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        Intent intent = new Intent();
        intent.setAction(RECEIVE_MSG_ACTION);
        Uri data = Uri.parse("msg://com.example.ssp1");
        intent.setData(data);
        //             uri  provider     ,   put  uri
        intent.putExtra("uri", "content://jobdispatcher/abc.txt");
        MainActivity.this.sendBroadcast(intent);
    }
});

ブロードキャストの登録の受信:

    
        

        
    

 
指向性ブロードキャストの受信方法:
public class Ssp1Receiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String uri = intent.getStringExtra("uri");
        if (uri != null) {
            try {
                //     1:    uri   
                InputStream inputStream = context.getContentResolver()
                        .openInputStream(Uri.parse(uri));
                BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(inputStream));
                String lineStr = null;
                while ((lineStr = bufferedReader.readLine()) != null) {
                    System.out.println("lineStr:" + lineStr);
                }
                bufferedReader.close();

                //     2:    uri   
                context.getContentResolver().openOutputStream(Uri.parse(uri),
                        "w");

                //     3:          
                AssetFileDescriptor descriptor = context.getContentResolver()
                        .openAssetFileDescriptor(Uri.parse(uri), "r");
                InputStream is = descriptor.createInputStream();
                //   uri     
                int start = uri.lastIndexOf('/');
                String fileName = uri.substring(start + 1);
                //         data/data/  /files    
                fileName = context.getFilesDir().getAbsolutePath() + "/"
                        + fileName;
                OutputStream os = new FileOutputStream(new File(fileName));
                byte[] b = new byte[1024];
                int len;
                while ((len = is.read(b)) != -1) {
                    os.write(b, 0, len);
                }
                os.flush();
                is.close();
                os.close();
                //     
                File file = new File(fileName);
                if (file.isFile() && file.exists()) {
                    InputStreamReader reader = new InputStreamReader(
                            new FileInputStream(file));
                    BufferedReader buffered = new BufferedReader(reader);
                    String lineTxt = null;
                    while ((lineTxt = buffered.readLine()) != null) {
                        System.out.println("lineTxt:" + lineTxt);
                    }
                    reader.close();
                    buffered.close();
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

例では、共有ファイルはdata/data/ディレクトリの下に格納され、人為的な変更を防止する.もちろんsdカードのファイルを共有することもできます.ただ安全性の面では保険がかかりません.