2016-09-28 6 views
0

Android 모바일 앱 개발을 배우고 있습니다. 나는 간단한 앱을 만들어 SMS를 보냈다. marshmallow를 실행하는 ADB 에뮬레이터를 사용하고 있습니다. 나는 그것에 대해 새로운 허가 here을 읽고 많은 문제가있는 내 문제에 answers 발견했습니다. 빌드 실패 - Android Marshmallow SMS_SEND 오류 : Gradle : java.io.FileNotFoundException : (액세스가 거부되었습니다.)

나는 CLEAN을하고 난 다음 메시지와 함께 인사를하고 구축

:

Error:Gradle: java.io.FileNotFoundException: C:Examples\MySMSApplication\app\build\intermediates\res\resources-debug.ap_ (Access is denied) 

참고 : 나는 내가 uses-permission android:name="android.permission.SEND_SMS을 제거 할 때 성공적으로 응용 프로그램을 구축하고 실행할 수입니다. 그러나 다른 에뮬레이터 번호 5554를 말하도록 SMS를 보내려고 할 때 항상 내 메시지 Permission denied을 받게됩니다.

두 개의 사용자 권한 세트가있는 Android 매니페스트가 있습니다.

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.fisher.app"> 
    <uses-permission android:name="android.permission.SEND_SMS"></uses-permission> 
    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> 

    <application 
      android:allowBackup="true" 
      android:icon="@mipmap/ic_launcher" 
      android:label="@string/mysmsapp" 
      android:supportsRtl="true" 
      android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 

       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

그런 다음 mainActivity 여기

public class MainActivity extends AppCompatActivity { 

    Button buttonSend; 
    EditText textPhoneNo; 
    EditText textSMS; 

    private static final int PERMISSION_REQUEST = 100; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     buttonSend = (Button) findViewById(R.id.buttonSend); 
     textPhoneNo = (EditText) findViewById(R.id.editTextPhoneNo); 
     textSMS = (EditText) findViewById(R.id.editTextSMS); 

     buttonSend.setOnClickListener(new View.OnClickListener() { 
      //this is the onclick listener of send button 
      @Override 
      public void onClick(View v) { 
       String phoneNo = textPhoneNo.getText().toString(); 
       String sms = textSMS.getText().toString(); 

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
        if (checkSelfPermission(Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) { 
         if (shouldShowRequestPermissionRationale(Manifest.permission.SEND_SMS)) { 
          Snackbar.make(findViewById(R.id.myView), "You need to grant SEND SMS permission to send sms", 
            Snackbar.LENGTH_LONG).setAction("OK", new View.OnClickListener() { 
           @Override 
           public void onClick(View v) { 
            requestPermissions(new String[]{Manifest.permission.SEND_SMS}, PERMISSION_REQUEST); 
           } 
          }).show(); 
         } else { 
          requestPermissions(new String[]{Manifest.permission.SEND_SMS}, PERMISSION_REQUEST); 
         } 
        } else { 
         sendSMS(phoneNo, sms); 
        } 
       } else { 
        sendSMS(phoneNo, sms); 
       } 
      } 
     }); 
    } 

    private void sendSMS(String phoneNo, String message) { 
     SmsManager sms = SmsManager.getDefault(); 
     sms.sendTextMessage(phoneNo, null, message, null, null); 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

      Snackbar.make(findViewById(R.id.myView), "Permission Granted", 
        Snackbar.LENGTH_LONG).show(); 
      sendSMS(textPhoneNo.getText().toString(), textSMS.getText().toString()); 

     } else { 

      Snackbar.make(findViewById(R.id.MyView), "Permission denied", 
        Snackbar.LENGTH_LONG).show(); 

     } 
    } 
} 

에 Gradle을이 타이밍에서 빌드입니다 :

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.3" 

    defaultConfig { 
     applicationId "com.example.fisher.myapp" 
     minSdkVersion 23 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:23.4.0' 
    compile 'com.android.support:design:23.1.1' 
} 
+0

API 24 이후부터는 런타임에 권한을 요청해야합니다. https://developer.android.com/training/permissions/requesting.html –

+0

@AmanGrover 동일한 링크를 언급 했으므로 런타임은 무엇이 아니라고합니다. 내 onClick 이벤트가 무엇입니까? 둘째로 저는 이것을 만들 수 없습니다. 앱이 에뮬레이터에로드되기 전에 Gradle에서 오류가 발생하는 것을 잘 알고 있습니다. –

답변

0

이 좋아 문제가 컴파일러 또는 전체 코드가 아닙니다 발견했다. 그것은 AndroidManifest를

와 내가 본과 읽고 방법이었다로의 AndroidManifest.xml에 권한을 정의하는 것이 있습니다 : 마시 멜로 SDK (23)에 영향을 미치는 권한과에 대해 좀 더 읽기 후,

<uses-permission android:name="android.permission.SEND_SMS"/> 

그러나 최대 나는 그것을 할 필요가 발견 :

<uses-permission-sdk-23 android:name="android.permission.SEND_SMS"/> 

참고 -sdk-23. 이렇게하면 빌드 문제가 해결되고 앱 예제는 SEND_SMS 권한이 사용되는지 확인하거나 사용하지 않는 경우 요청합니다.

관련 문제