我的第一个(铃声)应用程序的最后一块,我有一些麻烦,根据一些教程和朋友的一点帮助我想出了一个代码,从RAW文件夹中获取mp3作为Android铃声,通知和警报声。我在模拟器上测试过它有效,但是当我在我的S6edge上测试时没有发生任何事情,有人可以告诉我这个代码可能有什么问题,或者有人能指出我更好的编码解决方案
这是代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setSong(this, RingtoneManager.TYPE_RINGTONE, R.raw.test, "TestR");
setSong(this, RingtoneManager.TYPE_NOTIFICATION, R.raw.test, "TestN");
setSong(this, RingtoneManager.TYPE_ALARM, R.raw.test, "TestA");
}
/**
* In this method, we need to copy the mp3 file to the sd card location from
* where android picks up ringtone files
* After copying, we make the mp3 as current ringtone
*
* @param context
* @param type
* @param songId
* @param ringtoneTitle
* @return
*/
public static boolean setSong(Context context, int type, int songId, String ringtoneTitle) {
byte[] buffer = null;
InputStream fIn = context.getResources().openRawResource(
songId);
int size = 0;
try {
size = fIn.available();
buffer = new byte[size];
fIn.read(buffer);
fIn.close();
} catch (IOException e) {
return false;
}
String path = Environment.getExternalStorageDirectory().getPath()
+ "/media/audio/ringtones/";
String filename = ringtoneTitle + ".mp3";
boolean exists = (new File(path)).exists();
if (!exists) {
new File(path).mkdirs();
}
FileOutputStream save;
try {
save = new FileOutputStream(path + filename);
save.write(buffer);
save.flush();
save.close();
} catch (FileNotFoundException e) {
return false;
} catch (IOException e) {
return false;
}
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.parse("file://" + path + filename)));
File k = new File(path, filename);
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, ringtoneTitle);
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");
values.put(MediaStore.MediaColumns.SIZE, k.length());
// This method allows to change Notification and Alarm tone also. Just
// pass corresponding type as parameter
if (RingtoneManager.TYPE_RINGTONE == type) {
values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
} else if (RingtoneManager.TYPE_NOTIFICATION == type) {
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
} else if (RingtoneManager.TYPE_ALARM == type) {
values.put(MediaStore.Audio.Media.IS_ALARM, true);
}
Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
String selection = MediaStore.MediaColumns.DATA + " =?";
String[] selectionArgs = {k.getAbsolutePath()};
Uri newUri = null;
// Check if record exist
Cursor c = context.getContentResolver().query(uri, null, selection, selectionArgs, null);
if (c != null) {
if (c.getCount() > 0) {
// Record exist
// Update record
while (c.moveToNext()) {
int idIndex = c.getColumnIndex(MediaStore.Audio.Media._ID);
int dataIndex = c.getColumnIndex(MediaStore.Audio.Media.DATA);
String strId = c.getString(idIndex);
String songPath = c.getString(dataIndex);
newUri = MediaStore.Audio.Media.getContentUriForPath(songPath);
String condition = MediaStore.Audio.Media._ID + " =?";
String[] selectionArg = {strId};
context.getContentResolver().update(uri, values, condition, selectionArg);
}
} else {
// Record does not exist, create new
newUri = context.getContentResolver().insert(uri, values);
}
}
if (newUri != null) {
RingtoneManager.setActualDefaultRingtoneUri(context, type,
newUri);
return true;
}
return false;
}
}
当然,我获得了权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>`
和原始文件夹中的test.mp3文件
答案 0 :(得分:0)
从Android 6.0(API级别23)开始,用户在应用程序运行时向应用程序授予权限,而不是在安装应用程序时。此方法简化了应用安装过程,因为用户在安装或更新应用时无需授予权限。它还使用户可以更好地控制应用程序的功能;例如,用户可以选择让相机应用程序访问相机,但不能访问设备位置。用户可以随时转到应用程序的“设置”屏幕来撤消权限。
您需要在应用程序中处理运行时权限。 有关教程,请参阅以下链接。 Runtime Permission in Android