关闭

Android源码开发之mimeType分享

156人阅读 评论(0) 收藏 举报
分类:

好久没有分享Android开发的经历了

遇到一个小bug,apk分享界面没有蓝牙,这种问题很好解,Bluetooth里本身支持apk类型文件的分享,没有分享,可能是没有在AndroidManifest.xml文件里注册,于是在

<activity android:name=".opp.BluetoothOppLauncherActivity"
            android:process="@string/process"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:label="@string/bt_share_picker_label"
            android:excludeFromRecents="true"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:enabled="@bool/profile_supported_opp">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="image/*" />
                <data android:mimeType="video/*" />
                <data android:mimeType="audio/*" />
                <data android:mimeType="text/x-vcard" />
                <data android:mimeType="text/plain" />

后面加一条<data android:mimeType="application/vnd.android.package-archive" />就可以了

原本以为问题会这样解决,可是又遇到了一个新问题,apk文件,点击分享就会直接打开蓝牙分享,而不会弹出选择分享的dialog。

经分析,Android源码里,默认的几个app,只有蓝牙和email支持apk文件分享

查看分享的代码

intent = new Intent();
                intent.setAction(Intent.ACTION_SEND);
                intent.setType(mimeType);
                Uri uri = Uri.fromFile(fileInfo.getFile());
                intent.putExtra(Intent.EXTRA_STREAM, uri);
                LogUtils.d(TAG, "Share Uri file: " + uri);
                LogUtils.d(TAG, "Share file mimetype: " + mimeType);
                Log.i("type", "uri= "+uri);
                Log.i("type", "intent= "+Intent.createChooser(intent, getString(R.string.send_file)));
                try {
                    startActivity(Intent.createChooser(intent, getString(R.string.send_file)));
                } catch (android.content.ActivityNotFoundException e) {
                    LogUtils.e(TAG, "Cannot find any activity", e);
                }

Log打出来

I/type    ( 3143): ----------------Share-------------
I/type    ( 3143): mimeType= application/vnd.android.package-archive
I/type    ( 3143): uri= file:///storage/sdcard0/Pictures/antutu.apk
I/type    ( 3143): intent= Intent { act=android.intent.action.CHOOSER (has extras) }
I/type    ( 3143): ----------------Share-------------
I/type    ( 3143): mimeType= image/jpeg
I/type    ( 3143): uri= file:///storage/sdcard0/DCIM/Camera/IMG_20150101_000853.jpg
I/type    ( 3143): intent= Intent { act=android.intent.action.CHOOSER (has extras) }

感觉都没什么问题,于是分析,可能Email有问题,Email支持所有类型文件的分享

               <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="*/*" />

最后登录Email,竟然可以分享了

找到原因了

在packages/apps/Email/provider_src/com/android/email/provider/AccountReconciler.java

    private static boolean reconcileAccountsInternal(
            final Context context,
            final List<Account> emailProviderAccounts,
            final List<android.accounts.Account> accountManagerAccounts,
            final boolean performReconciliation) {

--------------------

            final ComponentName componentName = new ComponentName(context, composeActivityName);
            context.getPackageManager().setComponentEnabledSetting(componentName,
                    enableCompose ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
                            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                    PackageManager.DONT_KILL_APP);

将PackageManager.COMPONENT_ENABLED_STATE_DISABLED改为PackageManager.COMPONENT_ENABLED_STATE_ENABLED

就OK了

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10997次
    • 积分:414
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:1篇
    • 译文:1篇
    • 评论:6条
    文章分类
    最新评论