2017-06-25 15 views
0

連絡先の姓を「anyname」に編集するコードがあり、一部のAPIではうまく機能し、他のAPIでは機能しません。一部のAPIで連絡先の姓が編集されていません

android:onClick="start" 

とメインコード(ボイド開始):

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 
builder.withSelection(ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID + "=?", new String[]{String.valueOf(1)}); 
builder.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, "anyname"); 
ops.add(builder.build()); 

try 
{ 
    getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
} 

{String.valueOf(1)}は、第一のコンタクトを選択するためのものであることが主なコードは、このコードをボタンに触れることにより開始します。 4.3(API 18) - 4.4.4(API 19) - 6(API 23)-7(API 24)および7.1(API 25)で動作しません。他のAPIではうまく機能し、姓を変更することができます。エラーや例外については、私はそれらのどれにも例外を取得せず、API 18と19のために(モニタと実行ウィンドウで)何も取得しません。しかし、私はそれがすべてのモニタ私はAPI24の行をメモ帳にコピーしました。これらは、アプリケーションがデバッグまたは実行中にボタンをタッチした後に表示される行です。ボタンに触れると、何も表示されず、アプリケーションは何もしません。

https://uploadfiles.io/0sz9n

他のAPIは、あまりにもこれらの行を得ました。このため、私はAPI 24のみをコピーしました。あなたは問題が何かを理解できますか?その答えとしてこれを置く

+0

あなたが投稿したログがエラーを示しています 'SecurityExceptionが...必要ですREAD_CONTACTSまたはWRITE_CONTACTS'を使用している場合は、 Android M以上の実行時にもリクエストしてください。 https://developer.android.com/training/permissions/requesting.html – marmor

+0

を参照してください。また、自分が行っていることを理解していない限り、try/catchを使用して例外を非表示にしないでください。それ以外の場合は、例外を修正するためにあなたのアプリをクラッシュさせる必要があります – marmor

+0

おかげで男!出来た!私はこれらのコードをArrayListの前に追加します。 – Magasvazn

答えて

0

あなたが投稿したログは、エラーを示しています

SecurityException ... requires READ_CONTACTS or WRITE_CONTACTS

あなたがマニフェストにその許可を要求し、またAndroidのM上のランタイムでそれを要求しなければならないし、上記。あなたのフォローアップの質問についてhttp://developer.android.com/training/permissions/requesting.html

参照:

2つの許可要求の必要はありません

、マージできる2つのいずれかに:連絡先のIDが変更される可能性があり、それは非常にまれ

ActivityCompat.requestPermissions(this, 
    new String[]{ Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS }, first); 

であり、ほとんどの場合、コードが動作しないという問題には関係しません。 コードにいくつかのログを追加して、ボタンをクリックしたときにフローが停止しても動作しない場所を確認する必要があります。 また、例外を予期し、それを処理する方法がわからないかぎり、コードにtry/catchがないことを確認してください。そうでなければ、何も説明せずに(何もしないで)フローにつながる可能性があります(クラッシュのため)

コメントで述べた問題以下EDIT

は、ここにあなたがアクセス権の要求フローを処理する方法は次のとおりです。

public class MyActivity extends Activity { 
    ... 
    public void start(View v) { 
     if (ActivityCompat.checkSelfPermission(this, permission.WRITE_CONTACTS) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(this, new String[]{ permission.WRITE_CONTACTS }, 12345); 
     } else { 
      // WE ALREADY HAVE PERMISSION, RUN THE MAIN FUNCTION 
      editContacts(); 
     } 
    } 

    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     if ((requestCode == 12345) && (grantResults.length == 1) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) { 
      // WE GOT THE PERMISSION, RUN THE MAIN FUNCTION 
      editContacts(); 
     } 
    } 

    public void editContacts() { 
     ... 
    } 
} 
+0

明確化のおかげで、2つの問題、まず私はアマチュア私は本当にログを使用する方法を知らない。しかし、私は問題がここにあると思う:私は試して/キャッチ、このコード行を削除する: 'getContentResolver()。applyBatch(ContactsContract.AUTHORITY、ops);' get this error: '未処理の例外:android.os.RemoteException 、android.content.OperationApplicationException' -----私はAlt + Enterキーを押してこれらのコードをすべて実行する私の関数を変更: 'public void start(View v)throw RemoteException、OperationApplicationException' – Magasvazn

+0

そのコード行は固定されていますが、私はAPI 24(私がテストした唯一のアプリケーション)でアプリケーションを実行してエラーが発生して終了しました。これはメモ帳の新しいランタイムコードです:https://ufile.io/ltr15 – Magasvazn

+0

とbtwは、許可を得る必要のないAPI 21(5.0.0)。最初にAPI 24で実行したときにエラーが発生して終了した後、アクセス許可のプロンプトがポップアップして尋ねられます。拒否を選択した場合、このプロセスは次回も繰り返され、アプリケーションが再びクラッシュします。次回アプリケーションを実行したときにAllow(最初にアプリケーションを閉じた後に)を選択すると、終了せずエラーがなくなり、正常に動作します。 – Magasvazn

関連する問題