Android在4.4中设置自定义铃声

时间:2014-01-13 06:28:02

标签: android

我在android 4.4中面临问题,设置自定义铃声。下面的代码完美地工作到4.2版。有人请帮助我。通知音设置,但只听到默认的哔声。

我看到异常:

01-13 06:31:43.361: E/DatabaseUtils(15915): Writing exception to parcel
01-13 06:31:43.361: E/DatabaseUtils(15915): java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media/167 from pid=729, uid=1000 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.content.ContentProvider$Transport.enforceReadPermissionInner(ContentProvider.java:457)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:394)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.content.ContentProvider$Transport.enforceFilePermission(ContentProvider.java:387)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.content.ContentProvider$Transport.openFile(ContentProvider.java:297)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:232)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.os.Binder.execTransact(Binder.java:404)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.media.MediaPlayer._setDataSource(Native Method)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:991)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:972)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:921)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:874)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.media.Ringtone.setUri(Ringtone.java:180)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.media.RingtoneManager.getRingtone(RingtoneManager.java:593)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.media.RingtoneManager.getRingtone(RingtoneManager.java:384)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at com.android.providers.media.RingtonePickerActivity.run(RingtonePickerActivity.java:324)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.os.Handler.handleCallback(Handler.java:733)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.os.Handler.dispatchMessage(Handler.java:95)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.os.Looper.loop(Looper.java:137)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at android.app.ActivityThread.main(ActivityThread.java:5031)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at java.lang.reflect.Method.invokeNative(Native Method)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at java.lang.reflect.Method.invoke(Method.java:515)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
01-13 06:31:43.361: E/DatabaseUtils(15915):     at dalvik.system.NativeStart.main(Native Method)
01-13 06:31:43.361: D/(163): openContentUri(content://media/external/audio/media/167) caught exception -1
01-13 06:31:43.361: E/MediaPlayerService(163): Couldn't open fd for content://media/external/audio/media/167
01-13 06:31:43.361: E/MediaPlayer(15915): Unable to create media player
01-13 06:31:43.361: D/Ringtone(15915): Problem opening; delegating to remote player
01-13 06:31:43.361: D/ActivityManager(729): checkComponentPermission() adjusting {pid,uid} to {163,1013}
01-13 06:31:43.371: D/MediaPlayer(928): Couldn't open file on client side, trying server side
01-13 06:31:43.371: E/DatabaseUtils(15915): Writing exception to parcel
01-13 06:31:43.371: E/DatabaseUtils(15915): java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media/167 from pid=729, uid=1000 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
01-13 06:31:43.371: E/DatabaseUtils(15915):     at android.content.ContentProvider$Transport.enforceReadPermissionInner(ContentProvider.java:457)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:394)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at android.content.ContentProvider$Transport.enforceFilePermission(ContentProvider.java:387)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at android.content.ContentProvider$Transport.openFile(ContentProvider.java:297)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:232)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at android.os.Binder.execTransact(Binder.java:404)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at android.os.BinderProxy.transact(Native Method)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at android.media.IRingtonePlayer$Stub$Proxy.play(IRingtonePlayer.java:151)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at android.media.Ringtone.play(Ringtone.java:223)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at com.android.providers.media.RingtonePickerActivity.run(RingtonePickerActivity.java:329)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at android.os.Handler.handleCallback(Handler.java:733)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at android.os.Handler.dispatchMessage(Handler.java:95)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at android.os.Looper.loop(Looper.java:137)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at android.app.ActivityThread.main(ActivityThread.java:5031)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at java.lang.reflect.Method.invokeNative(Native Method)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at java.lang.reflect.Method.invoke(Method.java:515)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
01-13 06:31:43.371: E/DatabaseUtils(15915):     at dalvik.system.NativeStart.main(Native Method)
01-13 06:31:43.371: D/ActivityManager(729): checkComponentPermission() adjusting {pid,uid} to {163,1013}
01-13 06:31:43.381: D/(163): openContentUri(content://media/external/audio/media/167) caught exception -1

Java代码

  File k = new File(Environment.getExternalStorageDirectory()
                + file_main);

        ContentValues cont = new ContentValues();
        Log.i("tag", "uri =" + k.getAbsolutePath());
        Log.i("tag", "uri =" + Uri.fromFile(k).toString());

        cont.put(MediaStore.MediaColumns.DATA, Uri.fromFile(k).toString());
        // cont.put(MediaStore.AUTHORITY, Uri.fromFile(k).getAuthority());
        cont.put(MediaStore.MediaColumns.TITLE,
                "*" + file_main.split("\\.")[0]);
        cont.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mpeg");
        cont.put(MediaStore.Audio.Media.SIZE, Long.valueOf(k.length()));
        cont.put(MediaStore.Audio.Media.IS_RINGTONE, true);
        cont.put(MediaStore.Audio.Media.ARTIST, R.string.app_name);
        cont.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
        cont.put(MediaStore.Audio.Media.IS_ALARM, true);
        cont.put(MediaStore.Audio.Media.IS_MUSIC, true);

        Uri uri = MediaStore.Audio.Media.getContentUriForPath(Uri.fromFile(
                k).toString());
        context.grantUriPermission("android.media.MediaPlayer", uri,
                Intent.FLAG_GRANT_READ_URI_PERMISSION);
        context.getContentResolver().delete(
                uri,
                MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath()
                        + "\"", null);

        Uri newUri = context.getContentResolver().insert(uri, cont);
        Log.i("tag", "uri =" + newUri.toString());
        Log.i("tag", "uri authority =" + newUri.getAuthority());
        RingtoneManager.setActualDefa`enter code here`ultRingtoneUri(context,
                RingtoneManager.TYPE_RINGTONE, newUri);

        Toast.makeText(`enter code here`
                context,
                values[pos]
                        + " is added to  Notification and set as Notifiacaion tone",
                Toast.LENGTH_LONG).show();

0 个答案:

没有答案