Receiving a UDP packet problem - Java for Android App Development

I am trying to create a simple app that will receive UDP packets from a WiFi module. The WiFi module sends a packet every 5 seconds, but I have been unable to receive one successfully.
Using the toasts as a way to debug, I receive them, in the correct order, up to "DIDN'T GET IT HERE EITHER", which tells me that the problem lies in the 'socket.receive(packet)' line.
Does anyone have any insight as to why it might not be working? I have also tried variations of the code by looking at a lot of questions/examples online, but they all still result in the problem with the 'socket.receive(packet)' line.
Also, I wrote a python script to do the same thing, look for UDP packets on the same port, and running it with QPython, it does receive the packets, so it seems that the packets are being sent by the WiFi module, and received by the tablet, it's just that the app won't read the data for some reason.
Any help or insight will be greatly appreciated, thank you.
PHP:
public void run() {
Toast.makeText(this, "RIGHT BEFORE TRY", Toast.LENGTH_LONG).show();
DatagramSocket socket;
DatagramPacket packet;
try {
Toast.makeText(this, "IN THE TRY", Toast.LENGTH _LONG).show();
socket = new DatagramSocket(9750);
byte[] buf = new byte[1024]; //buffer
socket.setSoTimeout(100000);
Toast.makeText(this, "Timeout is: " + socket.getSoTimeout(), Toast.LENGTH_LONG).show();
Toast.makeText(this, "IN THE WILD!", Toast.LENGTH_LONG).show();
packet = new DatagramPacket(buf, buf.length);
Toast.makeText(this, "PACKET SIZE IS: " + buf.length, Toast.LENGTH_LONG).show();
try {
socket.receive(packet);
Toast.makeText(this, "GOT SOMETHING!", Toast.LENGTH_LONG).show();
}
catch (Exception i) {
Toast.makeText(this, "DIDN'T GET IT HERE EITHER!", Toast.LENGTH_LONG).show();
}
byte[] result = packet.getData();
System.arraycopy(packet.getData(), 0, result, 0, packet.getLength());
String msg = new String(result);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
Toast.makeText(this, "END WHILE!", Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(this, "DIDN'T GET IT!", Toast.LENGTH_LONG).show();
}
}

kerskine said:
I am trying to create a simple app that will receive UDP packets from a WiFi module. The WiFi module sends a packet every 5 seconds, but I have been unable to receive one successfully.
Using the toasts as a way to debug, I receive them, in the correct order, up to "DIDN'T GET IT HERE EITHER", which tells me that the problem lies in the 'socket.receive(packet)' line.
Does anyone have any insight as to why it might not be working? I have also tried variations of the code by looking at a lot of questions/examples online, but they all still result in the problem with the 'socket.receive(packet)' line.
Also, I wrote a python script to do the same thing, look for UDP packets on the same port, and running it with QPython, it does receive the packets, so it seems that the packets are being sent by the WiFi module, and received by the tablet, it's just that the app won't read the data for some reason.
Any help or insight will be greatly appreciated, thank you.
PHP:
public void run() {
Toast.makeText(this, "RIGHT BEFORE TRY", Toast.LENGTH_LONG).show();
DatagramSocket socket;
DatagramPacket packet;
try {
Toast.makeText(this, "IN THE TRY", Toast.LENGTH _LONG).show();
socket = new DatagramSocket(9750);
byte[] buf = new byte[1024]; //buffer
socket.setSoTimeout(100000);
Toast.makeText(this, "Timeout is: " + socket.getSoTimeout(), Toast.LENGTH_LONG).show();
Toast.makeText(this, "IN THE WILD!", Toast.LENGTH_LONG).show();
packet = new DatagramPacket(buf, buf.length);
Toast.makeText(this, "PACKET SIZE IS: " + buf.length, Toast.LENGTH_LONG).show();
try {
socket.receive(packet);
Toast.makeText(this, "GOT SOMETHING!", Toast.LENGTH_LONG).show();
}
catch (Exception i) {
Toast.makeText(this, "DIDN'T GET IT HERE EITHER!", Toast.LENGTH_LONG).show();
}
byte[] result = packet.getData();
System.arraycopy(packet.getData(), 0, result, 0, packet.getLength());
String msg = new String(result);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
Toast.makeText(this, "END WHILE!", Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(this, "DIDN'T GET IT!", Toast.LENGTH_LONG).show();
}
}
Click to expand...
Click to collapse
Check permissions have added in AndroidManifest.xml. (such as ACCESS_WIFI_STATE / ACCESS_NETWORK_STATE / INTERNET)

Related

MENU click NOT working

hi guys
i am in the process of implementing this menu but it is not updating the speed of my sensor
my code snipet is
here are my global variables
Code:
private static final int MENU_SLOW = 0;
private static final int MENU_NORMAL = 1;
private static final int MENU_FAST = 2;
private static final int MENU_EXIT = -1;
int ROTATION_SPEED = 3;
private static SensorManager mySensorManager;
private boolean sersorrunning;
private myCompassView myCompassView;
/** Called when the activity is first created.*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myCompassView = (myCompassView)findViewById(R.id.mycompassview);
mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
List<Sensor> mySensors = mySensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
if(mySensors.size() > 0){
mySensorManager.registerListener(mySensorEventListener, mySensors.get(0), ROTATION_SPEED);
sersorrunning = true;
Toast.makeText(this, "POINT the Needle to N for NORTH", Toast.LENGTH_LONG).show();
}
else{
Toast.makeText(this, "COMPASS not Initilised", Toast.LENGTH_LONG).show();
sersorrunning = false;
finish();
}
}
here is my sensor speed code
Code:
if(mySensors.size() > 0){
mySensorManager.registerListener(mySensorEventListener, mySensors.get(0), ROTATION_SPEED);
sersorrunning = true;
Toast.makeText(this, "POINT the Needle to N for NORTH", Toast.LENGTH_LONG).show();
}
else{
Toast.makeText(this, "COMPASS not Initilised", Toast.LENGTH_LONG).show();
sersorrunning = false;
finish();
}
and here is how i am trying to change the variable ROTATION_SPEED
Code:
public boolean onOptionsItemSelected (MenuItem item){
if (item.getItemId() == MENU_SLOW){
ROTATION_SPEED = SensorManager.SENSOR_DELAY_UI;
Toast.makeText(this, "Speed changed to SystemPreffered", Toast.LENGTH_SHORT).show();
}else if (item.getItemId() == MENU_NORMAL){
ROTATION_SPEED = SensorManager.SENSOR_DELAY_NORMAL;
Toast.makeText(this, "Speed changed to NORMAL", Toast.LENGTH_SHORT).show();
}else if (item.getItemId() == MENU_FAST){
ROTATION_SPEED = SensorManager.SENSOR_DELAY_FASTEST;
Toast.makeText(this, "Speed changed to FAST", Toast.LENGTH_SHORT).show();
}else if (item.getItemId() == MENU_EXIT){
android.os.Process.killProcess(android.os.Process.myPid());
Toast.makeText(this, "Exiting application...", Toast.LENGTH_SHORT).show();
}
return false;
}
ANY HELP WILL BE VERY MUCH APPRECIATED
thanks
shiraz
So I see you're setting the variable ROTATION_SPEED, but where are you ever using that to actually set the speed?
here is im changing the variable value
Code:
public boolean onOptionsItemSelected (MenuItem item){
if (item.getItemId() == MENU_SLOW){
ROTATION_SPEED = SensorManager.SENSOR_DELAY_UI;
Toast.makeText(this, "Speed changed to SystemPreffered", Toast.LENGTH_SHORT).show();
}else if (item.getItemId() == MENU_NORMAL){
ROTATION_SPEED = SensorManager.SENSOR_DELAY_NORMAL;
Toast.makeText(this, "Speed changed to NORMAL", Toast.LENGTH_SHORT).show();
}else if (item.getItemId() == MENU_FAST){
ROTATION_SPEED = SensorManager.SENSOR_DELAY_FASTEST;
Toast.makeText(this, "Speed changed to FAST", Toast.LENGTH_SHORT).show();
}else if (item.getItemId() == MENU_EXIT){
android.os.Process.killProcess(android.os.Process.myPid());
Toast.makeText(this, "Exiting application...", Toast.LENGTH_SHORT).show();
}
return false;
}
You're assigning a new value to ROTATION_SPEED, but never telling the sensor service that it's changed. I'm not familiar with the SensorManager class, but I think you have to re-call registerListener with the new value for the changes to be applied.
thanks dude
thats awesom
sorted this out ::
just aded the sensor manager after every new value given to ROTATION_SPEED
cheers

[Q] How to make faster lockscreen application?

I want to make a lockscreen application, so I made simple application.
But, this is too slow. Time from being on screen to seeing my application is almost 3 seconds.
Why this app is too slow?
Here is the my code.
(this method is included in the class that inherit BroadcastReceiver)
public void onReceive(Context context, Intent intent)
{
if (intent.getAction() == Intent.ACTION_SCREEN_OFF)
{
Toast.makeText(context, "Screen is off", Toast.LENGTH_SHORT).show();
Intent i = new Intent( context, MainActivity.class );
//i.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pi = PendingIntent.getActivity(context, 0, i, PendingIntent.FLAG_ONE_SHOT);
try
{
pi.send();
}
catch (CanceledException e)
{
e.printStackTrace();
}
}
}

app not sending sms

i am trying to send Message at a scheduled time in my app
here is my activty
Code:
case R.id.bSubmitborrowitem:
String b = mDateDisplay.getText().toString();
String c = mTimeDisplay.getText().toString();
String a = b + "-" + c;
String d = tv1.getText().toString();
String e = "hello";
Toast.makeText(getApplicationContext(), a,
Toast.LENGTH_LONG).show();
//*************coding of sms start here***********************//
// TODO Auto-generated method stub
String pick_no;
pick_no=d;
if(d.length()!=0&& e.length()!=0)
{
Intent b_Intent=new Intent();
b_Intent.setAction(MyAlarmService.ACTION);
b_Intent.putExtra("RQS", MyAlarmService.RQS_STOP_SERVICE);
Intent myIntent=new Intent(this,MyAlarmService.class);
myIntent.setAction(Intent.ACTION_SEND);
Bundle bundle=new Bundle();
bundle.putString("sms_number", d);
bundle.putCharSequence("body", e);
bundle.putString("contact_choose", d);
myIntent.putExtras(bundle);
pi=PendingIntent.getService(this, 0, myIntent,1);
pn.add(PendingIntent.getBroadcast(this, 0, b_Intent, android.content.Intent.FLAG_ACTIVITY_NEW_TASK));
pn.add(pi);
AlarmManager alarm_manager=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.DAY_OF_MONTH, mDay);
calendar.set(Calendar.MONTH, mMonth);
calendar.set(Calendar.YEAR, mYear);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, mminute);
calendar.clear();
alarm_manager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pi);
Toast.makeText(this, "your msg will be sending at "+hour+" hours and "+mminute+" min", Toast.LENGTH_LONG).show();
//*************coding of sms start here***********************//
And here is Service class
Code:
public class MyAlarmService extends Service {
String To,message_body,pick;
NotifyServiceReceiver notifyServiceReceiver;
final static String ACTION = "NotifyServiceAction";
final static String STOP_SERVICE = "";
final static int RQS_STOP_SERVICE = 1;
private static final int MY_NOTIFICATION_ID=1;
private NotificationManager notificationManager;
private Notification myNotification;
SmsManager sms;
[user=439709]@override[/user]
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
[user=439709]@override[/user]
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Toast.makeText(this, "Service created", Toast.LENGTH_LONG).show();
notifyServiceReceiver = new NotifyServiceReceiver();
}
[user=439709]@override[/user]
public void onDestroy() {
// TODO Auto-generated method
super.onDestroy();
Toast.makeText(getBaseContext(), "destroy",
Toast.LENGTH_SHORT).show();
}
private void CancelService() {
// TODO Auto-generated method stub
}
[user=439709]@override[/user]
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ACTION);
registerReceiver(notifyServiceReceiver, intentFilter);
Bundle bundle=intent.getExtras();
Toast.makeText(this, "service Started", Toast.LENGTH_LONG).show();
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
//---when the SMS has been sent---
registerReceiver(new BroadcastReceiver(){
[user=439709]@override[/user]
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS sent",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "Null PDU",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "Radio off",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT));
registerReceiver(new BroadcastReceiver(){
[user=439709]@override[/user]
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS delivered",
Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(), "SMS not delivered",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(DELIVERED));
sms = SmsManager.getDefault();
sms.sendTextMessage(bundle.getString("sms_number"), null,(String) bundle.getCharSequence("body") , sentPI, deliveredPI);
notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
myNotification = new Notification(R.drawable.ic_launcher, "Notification!",System.currentTimeMillis());
Context context = getApplicationContext();
String notificationTitle = "Exercise of Notification!";
String notificationText = "Message Notification";
PendingIntent myIntent1 = PendingIntent.getActivity(context, 0, new Intent(Intent.ACTION_VIEW, People.CONTENT_URI), 0);
myNotification.defaults |= Notification.DEFAULT_SOUND;
myNotification.flags |= Notification.FLAG_AUTO_CANCEL;
myNotification.setLatestEventInfo(context,notificationTitle,notificationText, myIntent1);
notificationManager.notify(MY_NOTIFICATION_ID, myNotification);
Toast.makeText(this, "your msg will be sending at ", Toast.LENGTH_LONG).show();
return START_STICKY;
}
[user=439709]@override[/user]
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
return super.onUnbind(intent);
}
public class NotifyServiceReceiver extends BroadcastReceiver{
[user=439709]@override[/user]
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
int rqs = arg1.getIntExtra("RQS", 0);
if (rqs == RQS_STOP_SERVICE){
stopSelf();
}
}
}
}
everything is fine.. there is no error in code. even the toast come up when i press the submit button..
but it is not sending message .. plzz help
Edit1 app is sending sms now but not on schedule time . it is sending sms instantly
I know this may be a silly question but did you add the proper permissions to your manifest for sending sms?
zalez said:
I know this may be a silly question but did you add the proper permissions to your manifest for sending sms?
Click to expand...
Click to collapse
yes i already added the permission.. check the edit in the main post. it is sending sms but not at schedule time.
This is how I did mine:
MainActivity button click event (or some other event):
Code:
//Now let's set up the alarm
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(MeterMaid.this,
0, intent, 0);
// We want the alarm to go off 30 seconds from now. Calendar.MINUTE
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(SECONDS_OR_MINUTES, (picker.getValue() - REMINDER_OFFSET));
// Schedule the alarm!
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
And my service to receive the alarm:
Code:
public class AlarmReceiver extends BroadcastReceiver
{
private int SIMPLE_NOTFICATION_ID;
[user=439709]@override[/user]
public void onReceive(Context context, Intent intent)
{
NotificationManager manger = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.meter128, "expiration warning", System.currentTimeMillis());
//intent.putExtra("Ringtone", Uri.parse("file:///sdcard/test.mp3"));
intent.putExtra("vibrationPatern", new long[] { 200, 300 });
intent.putExtra("Testtone", RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM));
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), 0);
notification.setLatestEventInfo(context, "Time is up!", "Your time is about to expire!!", contentIntent);
notification.flags = Notification.FLAG_INSISTENT;
notification.sound = (Uri) intent.getParcelableExtra("Testtone"); //Uri.parse("file:///sdcard/test.mp3"); //
notification.vibrate = (long[]) intent.getExtras().get("vibrationPatern");
// The PendingIntent to launch our activity if the user selects this notification
manger.notify(SIMPLE_NOTFICATION_ID, notification);
}
}

[Q] How do I display text from a messgae into a toast?

Hi all skilled developers,
I am a newbie in coding, and I just want to make some small changes to my app.
It is a licensing feature.
1) Licensee information are stored at a very simple website. With columns for Names, IMEI and Remarks.
2) I have the following chunk of code:
Code:
if(hadLicense) {
new AlertDialog.Builder(InsuranceGuruSplash.this)
.setTitle("License")
.setMessage("Your device is registered.\nWelcome.")
.setPositiveButton("Send", new DialogInterface.OnClickListener()
Intent intent = new Intent(InsuranceGuruSplash.this, MainActivity.class);
startActivity(intent);
finish();
I want to show a toast saying,
Welcome, Shawn. Your device is registered till DD/MM/YY.
Click to expand...
Click to collapse
Can someone teach me how I can go about doing this?:silly:
You can show a toast using:
Code:
Toast.makeText(context, text, duration).show();
Just make the text String first with the text and time. For duration use Toast.LENGTH_SHORT
SimplicityApks,
Thanks for your reply. I still don't really know what you mean. how do I echo a text from a website into the app's toast?
This is the full code:
Code:
protected Void doInBackground(Void... params) {
String url_for_sale = "www(dot)heyfellas(dot)com/guru/index.php";
parseLicense(url_for_sale);
return null;
}
@Override
protected void onPostExecute(Void result) {
TelephonyManager mngr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
final String imei = mngr.getDeviceId();
boolean hadLicense = false;
for(LicenseInfo license: licenses) {
if(license.phoneIMEI.equals(imei))
hadLicense = true;
}
if(hadLicense) {
Intent intent = new Intent(InsuranceGuruSplash.this, MainActivity.class);
startActivity(intent);
finish();
} else {
new AlertDialog.Builder(InsuranceGuruSplash.this)
.setTitle("License")
.setMessage("Your device is not registered.\nPlease send your details to the admin.")
.setPositiveButton("Send", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL , new String[]{"[email protected]"});
i.putExtra(Intent.EXTRA_SUBJECT, "Request for license");
i.putExtra(Intent.EXTRA_TEXT , "UserName: \n\nPhone Number: \n\nEmail: \n\nIMEI: " + imei);
try {
startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(PropertyGuruSplash.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.create().show();
}
}
}
You need
[java]
String name = ...;
String date = ....;
Toast.makeToast(Activity.this, name + ", you have registered since "+date, Toast.LENGTH_SHORT).show();[/java]
I suppose, you are strong at server side than in client programming? Then echo the result in your desired format in your php and read it in java then display it in toast. Use the below snippet:
Code:
HttpClient httpclient=new DefaultHttpClient();
HttpPost httppost=new HttpPost("http://www(dot)heyfellas(dot)com/guru/index.php");
HttpResponse response = httpclient.execute(httppost);
String Result = EntityUtils.toString(response.getEntity());
Toast.makeText(Context, Result, Toast.LENGTH_SHORT).show();

setActualDefaultRingtoneUri(,RingtoneManager.TYPE_ RING,) not work on s7 edge

Hi guys, could anyone help me with this?
I am trying to develop an application that could automatic change the ringtone for incoming calls, because all the existed applications which has this feature could not works well on my Galaxy S7 Edge,
but then I found out is't not that easy to change ringtone on Galaxy S7 Edge.
I am tried with these code:
File sdFile = new File("/mnt/storage/26D9-150C/test.mp3");
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, sdFile.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, sdFile.getName());
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");
values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
values.put(MediaStore.Audio.Media.IS_ALARM, false);
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
Uri uri = MediaStore.Audio.Media.getContentUriForPath(sdFile.getAbsolutePath());
getContentResolver().delete(uri ,null ,null);//if not delete, maybe it will cause some error.
Uri newUri = this.getContentResolver().insert(uri, values);
RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE, newUri);
These code works fine on other devices, also on the Galaxy S7 Edge, you can see the new ringtone with code below, the ringtone changed into the target file, but when you received a phone call it's not the the ringtone that I set ! It's still the old ringtone before I run that code above. What's the problem ????? And I checked the ringtone from "Setting-Sound and vibrate-ringtone-incoming ringtone" it's never changed!!!
And I have granted the WRITE_SETTINGS permission already.
private Uri getSystemDefaultRingtoneUri() {
return RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE);//RingtoneManager.TYPE_ALL
}
private String getRealPath(Uri fileUrl) {
String fileName = null;
Uri filePathUri = fileUrl;
if (fileUrl != null) {
if (fileUrl.getScheme().toString().compareTo("content") == 0) {
Cursor cursor = mContext.getContentResolver().query(fileUrl, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
fileName = cursor.getString(column_index);
if (!fileName.startsWith("/mnt")) {
fileName = "/mnt" + fileName;
}
cursor.close();
}
} else if (fileUrl.getScheme().compareTo("file") == 0) {
fileName = filePathUri.toString().replace("file://", "");
if (!fileName.startsWith("/mnt")) {
fileName += "/mnt";
}
}
}
return fileName;
}
Then I searched everywhere, and find out that it seems samsung changed the system, the TYPE_RINGTONE will not effect on samsung anymore, is it true ? How could fix this problem ?
Why samsung change it like this ? It's really ****ty for developers!
Could anyone help me ? Thank you!
And here is all the code:
public class ActivityMain extends AppCompatActivity {
private static final boolean d = true;
private Context mContext;
@override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
initView();
checkMyPermission(false);
}
private boolean checkMyPermission(boolean isSecondTimeCheck) {
String dialogTitle = "need WRITE_SETTINGS permission";
if (isSecondTimeCheck) dialogTitle = "you deny the permission";
String btnTitle = "ok", if (isSecondTimeCheck) btnTitle = "try again";
if (Build.VERSION.SDK_INT >= 23) {
if (!Settings.System.canWrite(this)) {
new AlertDialog.Builder(mContext).setMessage(dialogTitle).setPositiveButton(btnTitle, new DialogInterface.OnClickListener() {
 @override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE_PERMISSION);
}
}).setNegativeButton("cancel", null).create().show();
return false;
}
return true;
} else {
int hasWriteContactsPermission = ContextCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_SETTINGS);
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
new AlertDialog.Builder(mContext).setMessage(dialogTitle).setPositiveButton(btnTitle, new DialogInterface.OnClickListener() {
 @override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE_PERMISSION);
}
}).setNegativeButton("cancel", null).create().show();
return false;
} else {
return true;
}
}
}
private void initView() {
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
 @override
public void onClick(View view) {
//TODO I added the event here, it's more easier......this is the automatic method
// Log.d("tag", "original ringtone before set new ringtone" + getRealPath(getSystemDefaultRingtoneUri()));
// setMyRingtone("/mnt/storage/26D9-150C/0_MyFiles/8.Others/New_Eng_Rings_15.09.03/Blame it on me - akon - A.mp3");
// //setMyRingtone("/mnt/storage/26D9-150C/0_MyFiles/8.Others/New_Eng_Rings_15.09.03/Birthmark - akon - A.mp3");
//TODO here is the 2nd method, manual setting also not work....
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Choose the new ringtone");
startActivityForResult(intent, REQUEST_CODE_CHOOSE_RINGTONE_BY_USER);
}
});
}
private static final int REQUEST_CODE_PERMISSION = 1;
private static final int REQUEST_CODE_CHOOSE_RINGTONE_BY_USER = 2;
private void setMyRingtone(String path) {
File sdFile = new File(path);
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, sdFile.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, sdFile.getName());
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");
values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
values.put(MediaStore.Audio.Media.IS_ALARM, false);
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
Uri uri = MediaStore.Audio.Media.getContentUriForPath(sdFile.getAbsolutePath());
getContentResolver().delete(uri, null, null);
Uri newUri = this.getContentResolver().insert(uri, values);
RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE, newUri);
Log.d("tag", "new ringtone has been set:" + getRealPath(getSystemDefaultRingtoneUri()));//you can see that the new ringtone has been set success!
}
private Uri getSystemDefaultRingtoneUri() {
return RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE);//RingtoneManager.TYPE_ALL
}
private String getRealPath(Uri fileUrl) {
String fileName = null;
Uri filePathUri = fileUrl;
if (fileUrl != null) {
if (fileUrl.getScheme().toString().compareTo("content") == 0) {
Cursor cursor = mContext.getContentResolver().query(fileUrl, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
fileName = cursor.getString(column_index);
if (!fileName.startsWith("/mnt")) {
fileName = "/mnt" + fileName;
}
cursor.close();
}
} else if (fileUrl.getScheme().compareTo("file") == 0) {
fileName = filePathUri.toString().replace("file://", "");
if (!fileName.startsWith("/mnt")) {
fileName += "/mnt";
}
}
}
return fileName;
}
/* 当设置铃声之后的回调函数 */
 @override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CODE_PERMISSION:
checkMyPermission(true);
break;
case REQUEST_CODE_CHOOSE_RINGTONE_BY_USER:
if (resultCode == RESULT_OK) {
try {
Uri pickedUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
if (pickedUri != null) {
Log.d("tag", "new ringtone will be set into:" + getRealPath(pickedUri));
RingtoneManager.setActualDefaultRingtoneUri(mContext, RingtoneManager.TYPE_RINGTONE, pickedUri);
Log.d("tag", "new ringtone has been set into:" + getRealPath(getSystemDefaultRingtoneUri()));
}
} catch (Exception e) {
if (d) e.printStackTrace();
}
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
}
Please help, thank you.
is anyone could help ?
help....
You need the
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
Permission. Only grantable for System apps.
nicholaschum said:
You need the
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
Permission. Only grantable for System apps.
Click to expand...
Click to collapse
Thanks for your reply.
I have this permission in my manifest.xml already.
It seems samsung ringtong not use the standard database...
Cooper.G said:
Thanks for your reply.
I have this permission in my manifest.xml already.
It seems samsung ringtong not use the standard database...
Click to expand...
Click to collapse
As I said, your app must be a system app (or a privileged app). Or else, adding this manifest to a normal app will not function at all and is useless.
nicholaschum said:
As I said, your app must be a system app (or a privileged app). Or else, adding this manifest to a normal app will not function at all and is useless.
Click to expand...
Click to collapse
Actually I think it's not the metter about the permission, the permission has been authorized, and the ringtone really changed into my ringtone on my device,
use these code you can see the default ringtone has changed after set.
private Uri getSystemDefaultRingtoneUri() {
return RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE);//RingtoneManager.TYPE_ALL
}
Also use a different application to check the default ringtone, it's changed into the one that I choosen.
But in fact the the ring of incoming call from the speaker never changed.
So I think samsung use a different ringtone database or whatever.
Oh, and all kinds of random ringtong tools not work on S7edge.
I will try to figure it out when I rooted my s7edge.
And before this, I found some information about samsung ring of alarm, so I think the call maybe the same reason, http://bbs.anzhuo.cn/thread-938419-1-1.html
anyway, thanks for reply.
nicholaschum said:
As I said, your app must be a system app (or a privileged app). Or else, adding this manifest to a normal app will not function at all and is useless.
Click to expand...
Click to collapse
And here is the way for android 6.0.1 to ask the WRITE_SETTINGS permission
private boolean checkMyPermission(boolean isSecondTimeCheck) {
String dialogTitle = "need WRITE_SETTINGS permission";
if (isSecondTimeCheck) dialogTitle = "you deny the permission";
String btnTitle = "ok", if (isSecondTimeCheck) btnTitle = "try again";
if (Build.VERSION.SDK_INT >= 23) {
if (!Settings.System.canWrite(this)) {
new AlertDialog.Builder(mContext).setMessage(dialogTit le).setPositiveButton(btnTitle, new DialogInterface.OnClickListener() {
 @override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE_PERMISSION);
}
}).setNegativeButton("cancel", null).create().show();
return false;
}
return true;
} else {
int hasWriteContactsPermission = ContextCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_SETTINGS);
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
new AlertDialog.Builder(mContext).setMessage(dialogTit le).setPositiveButton(btnTitle, new DialogInterface.OnClickListener() {
 @override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE_PERMISSION);
}
}).setNegativeButton("cancel", null).create().show();
return false;
} else {
return true;
}
}
}
Cooper.G said:
Actually I think it's not the metter about the permission, the permission has been authorized, and the ringtone really changed into my ringtone on my device,
use these code you can see the default ringtone has changed after set.
private Uri getSystemDefaultRingtoneUri() {
return RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE);//RingtoneManager.TYPE_ALL
}
Also use a different application to check the default ringtone, it's changed into the one that I choosen.
But in fact the the ring of incoming call from the speaker never changed.
So I think samsung use a different ringtone database or whatever.
Oh, and all kinds of random ringtong tools not work on S7edge.
I will try to figure it out when I rooted my s7edge.
And before this, I found some information about samsung ring of alarm, so I think the call maybe the same reason, http://bbs.anzhuo.cn/thread-938419-1-1.html
anyway, thanks for reply.
Click to expand...
Click to collapse
The permission has NOT been authorized. Please try to wrap your head around this. Your code is really messy.
https://github.com/android/platform_frameworks_base/blob/master/core/res/AndroidManifest.xml#L1597
Line 1600 states that you must have built the system through same firmware signature, "preinstalled" (priv-app), appop and pre-23 API
1595 states that it has a protection level of signature meaning that if the app isn't signed with the same signature as the ROM it won't be authorized to use that permission.
You can also try "pm grant YOUR_APP_NAME android.permission.WRITE_SETTINGS" in adb shell - and you will get an error saying it isn't a grantable permission.
Finally, if your app is a downloadable app from Play Store, this is the only caveat. Unless you request root to priv-app, THIS PERMISSION ISN'T GRANTED.
Java:
private boolean checkWriteSettingsPermissions() {
String permission = "android.permission.WRITE_SETTINGS";
int res = getContext().checkCallingOrSelfPermission(permission);
return (res == PackageManager.PERMISSION_GRANTED);
}
This is simple code that allows you to check whether your app is granted the permission.
nicholaschum said:
The permission has NOT been authorized. Please try to wrap your head around this. Your code is really messy.
https://github.com/android/platform_frameworks_base/blob/master/core/res/AndroidManifest.xml#L1597
Line 1600 states that you must have built the system through same firmware signature, "preinstalled" (priv-app), appop and pre-23 API
1595 states that it has a protection level of signature meaning that if the app isn't signed with the same signature as the ROM it won't be authorized to use that permission.
You can also try "pm grant YOUR_APP_NAME android.permission.WRITE_SETTINGS" in adb shell - and you will get an error saying it isn't a grantable permission.
Finally, if your app is a downloadable app from Play Store, this is the only caveat. Unless you request root to priv-app, THIS PERMISSION ISN'T GRANTED.
Java:
private boolean checkWriteSettingsPermissions() {
String permission = "android.permission.WRITE_SETTINGS";
int res = getContext().checkCallingOrSelfPermission(permission);
return (res == PackageManager.PERMISSION_GRANTED);
}
This is simple code that allows you to check whether your app is granted the permission.
Click to expand...
Click to collapse
Thank you for your patient.
1. I tried your code, and I was wrong about the permission, it says PERMISSION_DENIED. but I think this is not the problem for this question.
2. Did you tried my code ? The way that I asked for "WRITE_SETTINGS" is really work for ringtone, altho
Java:
private boolean checkWriteSettingsPermissions() {
String permission = "android.permission.WRITE_SETTINGS";
int res = getContext().checkCallingOrSelfPermission(permission);
return (res == PackageManager.PERMISSION_GRANTED);
}
said "PERMISSION_DENIED" , but it's really changed the ringtone ! If you not believe this, please try by yourself, and you can see from the setting - ring and vibrate - ringtone , you can see the result.
3. After several times try, I figure it out now... both way(manual and auto set by code "setMyRingtone()") of set the ringtone will work on the phone if have the permission of "Settings.System.canWrite(this)", but only work for the Ringtone of SIM 1, not work for SIM2. you can see the result form the setting page(only the ringtone for sim1 will change). if the ringtone still play the default ring of system, the problem probably is the metter of URI .
4. Before I post this thread, both way won't change the result of ringtone from the setting page of the phone, but as I said , you can see the result form another third part application.(this problem most probably is that I only use one SIM card at that time, did I put it into sim2? I don't know, already forget... but now if I put it into sim2 the ringtone form the setting page of the phone never change, but from the log of the code you can see the result is correct actually.)
5. Now the problem change into "How to create a standard URI and how to change the ringtone for SIM2". I will try to work on it.
6. Sorry for my pool English, and sorry for the "messy" code, I will improve it.
Anyway , thank you. you r the only one who helped me... Wish u luck.
Cooper.G said:
6. Sorry for my pool English, and sorry for the "messy" code, I will improve it.
Click to expand...
Click to collapse
I had the ringtone added on my MediaProvider but not set as the current one, I believe AOSP and TW deving is different.
When I mentioned "messy" I meant just copying and pasting the code into the forum, use
Code:
tags next time so it formats perfectly! :good::highfive:
nicholaschum said:
I had the ringtone added on my MediaProvider but not set as the current one, I believe AOSP and TW deving is different.
When I mentioned "messy" I meant just copying and pasting the code into the forum, use
Code:
tags next time so it formats perfectly! :good::highfive:
Click to expand...
Click to collapse
Thank you !
Cooper.G said:
Thank you for your patient.
1. I tried your code, and I was wrong about the permission, it says PERMISSION_DENIED. but I think this is not the problem for this question.
2. Did you tried my code ? The way that I asked for "WRITE_SETTINGS" is really work for ringtone, altho
Java:
private boolean checkWriteSettingsPermissions() {
String permission = "android.permission.WRITE_SETTINGS";
int res = getContext().checkCallingOrSelfPermission(permission);
return (res == PackageManager.PERMISSION_GRANTED);
}
said "PERMISSION_DENIED" , but it's really changed the ringtone ! If you not believe this, please try by yourself, and you can see from the setting - ring and vibrate - ringtone , you can see the result.
3. After several times try, I figure it out now... both way(manual and auto set by code "setMyRingtone()") of set the ringtone will work on the phone if have the permission of "Settings.System.canWrite(this)", but only work for the Ringtone of SIM 1, not work for SIM2. you can see the result form the setting page(only the ringtone for sim1 will change). if the ringtone still play the default ring of system, the problem probably is the metter of URI .
4. Before I post this thread, both way won't change the result of ringtone from the setting page of the phone, but as I said , you can see the result form another third part application.(this problem most probably is that I only use one SIM card at that time, did I put it into sim2? I don't know, already forget... but now if I put it into sim2 the ringtone form the setting page of the phone never change, but from the log of the code you can see the result is correct actually.)
5. Now the problem change into "How to create a standard URI and how to change the ringtone for SIM2". I will try to work on it.
6. Sorry for my pool English, and sorry for the "messy" code, I will improve it.
Anyway , thank you. you r the only one who helped me... Wish u luck.
Click to expand...
Click to collapse
Hey Have you found the solution..?

Categories

Resources