Hello,
I'm new to developing software in Java, but especially with Android. I am going through a tutorial on how to create an RSS Feed Reader and so far I've got it mostly working, but I've got a few bugs I can't seem to figure out.
I wanted to post images, but it wouldn't let me, but anyway:
main activity - title, pubdate both work, as does each article's title.
after clicking on a title, the other activity is launched and the article is shown:
showdescription activity is launched - title, pubdate, link all work and display correctly.
bug: description does not always display everything or even display at all depending on the xml source.
I'm wondering if my problem is somewhere these code snippets, as this tutorial was written some time ago.
These are pretty basic, so I'm doubting the problem is in here.
RSSHandler said:
if (localName.equals("description"))
{
currentstate = RSS_DESCRIPTION;
return;
}
...
case RSS_DESCRIPTION:
_item.setDescription(theString);
currentstate = 0;
break;
Click to expand...
Click to collapse
RSSItem said:
void setDescription(String description)
{
_description = description;
}
...
String getDescription()
{
return _description;
}
Click to expand...
Click to collapse
This is where I believe the problem exists, in the onItemClick method or the ShowDescription class.
RSSReader said:
public void onItemClick(AdapterView parent, View v, int position, long id)
{
Log.i(tag,"item clicked! [" + feed.getItem(position).getTitle() + "]");
Intent itemintent = new Intent(this,ShowDescription.class);
Bundle b = new Bundle();
b.putString("title", feed.getItem(position).getTitle());
b.putString("description", feed.getItem(position).getDescription());
b.putString("link", feed.getItem(position).getLink());
b.putString("pubdate", feed.getItem(position).getPubDate());
itemintent.putExtra("android.intent.extra.INTENT", b);
//startSubActivity(itemintent, 0);
startActivity(itemintent);
}
Click to expand...
Click to collapse
ShowDescription said:
public class ShowDescription extends Activity
{
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.showdescription);
String theStory = null;
Intent startingIntent = getIntent();
if (startingIntent != null)
{
Bundle b = startingIntent.getBundleExtra("android.intent.extra.INTENT");
if (b == null)
{
theStory = "bad bundle?";
}
else
{
theStory = b.getString("title")
+ "\n\n" + b.getString("pubdate")
+ "\n\n" + b.getString("description")
+ "\n\nView Website:\n" + b.getString("link");
}
}
else
{
theStory = "Information Not Found.";
}
TextView db= (TextView) findViewById(R.id.storybox);
db.setText(theStory);
Button backbutton = (Button) findViewById(R.id.back);
backbutton.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v)
{
finish();
}
});
}
}
Click to expand...
Click to collapse
Originally the tutorial called for "startSubActivity" for starting the ShowDescription activity, but that doesn't seem to exist anymore?
The XML source I'm using can't be displayed because I can't link in outside pages, but I can PM it to you if you'd like.
I have tried using a .replaceAll("\\<.*?>","") but it didn't seem to change much about whether the <description> tag's content is displayed or not.
Anyway, if anyone takes the time to look at this, it'd be greatly appreciated, and thank you!
If you need me to post anymore code let me know.
So I think I've figured it out, well somewhat.
While stepping through the code, the <description> tag's content consists of a single < character. Then the parser goes through two more tags that contain, p and > before actually hitting the content I want.
So it looks something like this:
<description>
<
<?>
p
<?>
>
<?>
"wanted content"
</?>
</?>
</?>
</description>
Click to expand...
Click to collapse
I've been trying to learn to program for Android lately by simply coming up with ideas and implementing them. It started out easy enough with pulling information from an online RSS feed and showing this in a nice environment. But the current idea has me stumped.
I'd like the following to happen:
Take a picture using intent
Entire picture is shown in a new activity
Zoom in on a certain spot
Add predefined items to the picture
Press next which connects the items from left to right
Add some more items
Press next to connect the new items
Zoom out
Save the image
First taking a picture, this wasn't too hard using the camera intent:
Code:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
I can then extract the absolute path from fileUri with the following line:
Code:
String path = new File(fileUri.getPath()).getAbsolutePath();
This path can be put in a bundle which can be put in an intent which is then used to start the activity that should show the image.
Code:
public class TestActivity extends Activity implements SurfaceHolder.Callback {
private static final String TAG = TestActivity.class.getSimpleName();
private String path = "";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SurfaceView view = new SurfaceView(this);
setContentView(view);
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
path = bundle.getString("path");
view.getHolder().addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Canvas canvas = holder.lockCanvas();
if (canvas == null) {
Log.d(TAG,"Can't draw because canvas is null");
}
else {
Bitmap bitmap = BitmapFactory.decodeFile(path);
Paint paint = new Paint();
if(bitmap == null) {
Log.d(TAG,"Can't draw because bitmap is null");
}
else {
canvas.drawBitmap(bitmap,0,0,paint);
}
holder.unlockCanvasAndPost(canvas);
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int frmt, int w, int h) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
The first issue here is that it of course doesn't show the entire photo. Not that surprising considering it's larger than the view. Ideally I'd like to zoom out to show the entire photograph. Once I've zoomed one way I'd assume that zooming in on the part that you want should also be possible.
Next is adding the objects. My idea was simply catching any touch events and adding a new object once the finger is released. This way I'd end up with a list of items with each having a draw function which can be called through the surfaceview when it is redrawn.
Connecting these items could simply be done by creating a line object and going through the list of all items and using their locations for the begin and endpoints of the lines
One of the big issues here is that the x and y locations would be relative to the screen, not to the photo. Which would mean that when you zoom back out the entire background would change but the actual items would remain at the same spot and in the same size.
I've been searching and searching for any tutorial or other question about the same issue, but either I've had no luck or I've been using the wrong keywords. And for all I know everything I have up till now could be wrong.
If anyone could give some pointers, or maybe knows a guide or tutorial somewhere or some better keywords I could use for searching I'd really appreciate it.
Xylon- said:
One of the big issues here is that the x and y locations would be relative to the screen, not to the photo. Which would mean that when you zoom back out the entire background would change but the actual items would remain at the same spot and in the same size.
Click to expand...
Click to collapse
would you just not need to either control or track the sample/scale if the image so that you know the 1st pixel displayed (top left) and the scale factor, then the eventX/Y can be processed to be relative to what you want ?
Here are the adapter and asynctask class
Code:
class Myadapter extends ArrayAdapter<Layoutelements> {
Context context;
public Myadapter(Context context, int resourceId,List<Layoutelements> items) {
super(context, resourceId, items);
this .context = context;
}
/*private view holder class*/
private class ViewHolder {
ImageView imageView;
TextView txtTitle;
TextView txtDesc;
}
public View getView( int position, View convertView, ViewGroup parent) {
ViewHolder holder = null ;
Layoutelements rowItem = getItem(position);
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.rowlayout, null );
holder = new ViewHolder();
holder.txtDesc = (TextView) convertView.findViewById(R.id.secondLine);
holder.txtTitle = (TextView) convertView.findViewById(R.id.firstline);
holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
holder.txtDesc.setText(rowItem.getDesc().toString());
holder.txtTitle.setText(rowItem.getTitle());
String ext=getFileExtension(rowItem.getDesc());
if(ext.equals(".apk"))
{holder.imageView.setImageDrawable(rowItem.getImageId());
holder.imageView.setTag(rowItem.getDesc());//
////tag of imageView == path
////to image
new ImageDownloaderTask(holder.imageView).execute(rowItem.getDesc());
}
else if(ext.equals(".png") || ext.equals(".jpg") || ext.equals(".jpeg"))
{holder.imageView.setImageDrawable(rowItem.getImageId());
holder.imageView.setTag(rowItem.getDesc());//
////tag of imageView == path
////to image
new LoadImage(holder.imageView).execute(rowItem.getDesc());
}
else{
holder.imageView.setImageDrawable(rowItem.getImageId());}
return convertView;
}
}
Code:
class ImageDownloaderTask extends AsyncTask<String, Void, Drawable> {
private final WeakReference<ImageView> imageViewReference;
private String path;
public ImageDownloaderTask(ImageView imageView) {
imageViewReference = new WeakReference<ImageView>(imageView);
}
@Override
// Actual download method, run in the task thread
protected Drawable doInBackground(String... params) {
// params comes from the execute() call: params[0] is the url.
path =params[0];
try{PackageManager pm=getPackageManager();
PackageInfo pi=pm.getPackageArchiveInfo(path,0);
//// the secret arethese two lines....
pi.applicationInfo.sourceDir=path;
pi.applicationInfo.publicSourceDir=path;
////
return pi.applicationInfo.loadIcon(pm);
}catch(Exception e){return getResources().getDrawable(R.drawable.apk);}
}
@Override
// Once the image is downloaded, associates it to the imageView
protected void onPostExecute(Drawable bitmap) {
if (isCancelled()) {
bitmap = null;
}
if (imageViewReference != null) {
ImageView imageView = imageViewReference.get();
if (imageView != null) {
if (bitmap != null) {
imageView.setImageDrawable(bitmap);
} else {
imageView.setImageDrawable(imageView.getContext().getResources()
.getDrawable(R.drawable.apk));
}
}
}
}
}
I am making a file manager.
Now the problem is like this.
If i scroll down icons load correctly. But when i scroll up, the icons load again.they are not cached once they are loaded.i want that icons are cached till directory is changed.
Sent from my GT-S5570 using XDA Premium 4 mobile app
arpitkh96 said:
I am making a file manager.
Now the problem is like this.
If i scroll down icons load correctly. But when i scroll up, the icons load again.they are not cached once they are loaded.i want that icons are cached till directory is changed.
Click to expand...
Click to collapse
Try using an LruCache or your images. Also, you might want to take a look at this guide explaining it further.
SimplicityApks said:
Try using an LruCache or your images. Also, you might want to take a look at this guide explaining it further.
Click to expand...
Click to collapse
Thanks i will check them
Sent from my GT-S5570 using XDA Premium 4 mobile app
It worked but is buggy.the images many times get blurred after scrolling up as shown in screenshots.See the thumbnails in both images
Sent from my GT-S5570 using XDA Premium 4 mobile app
After scroll
Is this due to low cache memory.should i try on another device.should i show you the new modified code.
Sent from my GT-S5570 using XDA Premium 4 mobile app
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..?