trying to make a simple APP to insert a phonebook entry. It seems that I have no problems with permissions, but the system will still not allow you to create a record:
07-28 18:11:44.799 2304 10616 I UpdateIcingCorporaServi: Updating corpora: APPS=com.example.aero.myapplication, CONTACTS=MAYBE
07-28 18:11:45.362 2304 10648 I UpdateIcingCorporaServi: Updating corpora: APPS=com.example.aero.myapplication.test, CONTACTS=MAYBE
07-28 18:11:45.651 10663 10678 I GrantPermissionCallable: Permission: android.permission.WRITE_CONTACTS is already granted!
07-28 18:11:46.255 10663 10678 I OK : contact Permission to record allowed
07-28 18:11:46.255 10663 10678 D Info : Creating contact: 123456789
07-28 18:11:46.259 2097 2114 E DatabaseUtils: java.lang.SecurityException: Proxy package com.android.providers.contacts from uid 10001 or calling package com.example.aero.myapplication.test from uid 10097 not allowed to perform WRITE_CONTACTS
07-28 18:11:46.260 10663 10678 E Error : Exception encountered while inserting contact: java.lang.SecurityException: Proxy package com.android.providers.contacts from uid 10001 or calling package com.example.aero.myapplication.test from uid 10097 not allowed to perform WRITE_CONTACTS
any ideas? why is this mysticism? after launching the application, install 2 apk:
$ adb push /Users/aero/AndroidStudioProjects/MyApplication/app/build/outputs/apk/app-debug.apk /data/local/tmp/com.example.aero.myapplication
$ adb shell pm install -r "/data/local/tmp/com.example.aero.myapplication"
and
$ adb push /Users/aero/AndroidStudioProjects/MyApplication/app/build/outputs/apk/app-debug-androidTest.apk /data/local/tmp/com.example.aero.myapplication.test
$ adb shell pm install -r "/data/local/tmp/com.example.aero.myapplication.test"
and only com.example.aero.myapplication has permissions on the system, com.example.aero.myapplication.test does not have any permissions. I lost a little.
package com.example.aero.myapplication;
import android.Manifest;
import android.app.Instrumentation;
import android.content.ContentProviderOperation;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.provider.ContactsContract;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SdkSuppress;
import android.support.test.rule.GrantPermissionRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.UiDevice;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import org.junit.Before;
import org.junit.Rule;
import org.junit.runner.RunWith;
import java.util.ArrayList;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
@RunWith(AndroidJUnit4.class)
public class MainActivity{
@Rule
public GrantPermissionRule permissionRule = GrantPermissionRule.grant(Manifest.permission.WRITE_CONTACTS);
public Instrumentation instrumentation;
private UiDevice mDevice;
private static final int RECORD_REQUEST_CODE = 101;
@Before
public void before() {
mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
assertThat(mDevice, notNullValue());
mDevice.pressHome();
}
@org.junit.Test
public void test() throws InterruptedException {
Context context = InstrumentationRegistry.getInstrumentation().getContext();
String NAME = "TEST RECORD";
String NMBR = "123456789";
CreatePhoneBookEntry(context, NAME, NMBR);
}
public void CreatePhoneBookEntry(Context context, String NAME, String NMBR) {
int permission = ActivityCompat.checkSelfPermission(context,
Manifest.permission.WRITE_CONTACTS);
if (permission != PackageManager.PERMISSION_GRANTED) {
Log.i("Error", "contact Permission to record denied");
} else {
Log.i("OK", "contact Permission to record allowed");
};
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
ContentProviderOperation.Builder op =
ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null);
ops.add(op.build());
op =
ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, NAME);
ops.add(op.build());
op =
ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, NMBR)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, "MOBILE");
ops.add(op.build());
Log.d("Info", "Creating contact: " + NMBR);
try {
context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
} catch (Exception e) {
Log.e("Error", "Exception encountered while inserting contact: " + e);
}
}
}